R2/R3 "bindologie"
DideC18-Feb-2013/10:10:35+1:00
Bonjour à tous,

Vu dans un autre post une question :
"un truc que j'aime pas dans Rebol, par défaut les variables sont globales! Bizarre comme choix de la part de guru informatique. (Peut être que sur R3 c'est différent, je commence juste)"

Du coup ça me donne envie d'apporter du grain à moudre pour la compréhension de tous. Mais je suis pas un guru (non, non. Surtout pour ce genre de détails), alors je vais juste ressasser la base :

IL N'Y A PAS DE "PORTEE" DES VARIABLES DANS REBOL CAR IL N'Y A PAS DE VARIABLES DANS REBOL !

Non, il n'y a que des mots (word!) auxquels peuvent être associés (binding) des valeurs dans différents contextes (object!). On peut avoir des mots sans valeur (unset!) et aussi des valeurs sans mots pour les atteindre (cas de l'utilisation de 'context sans set-word! devant).

Donc le programmeur à l'impression d'utiliser des variables, simplement parce-que ça y ressemble. Mais il y a de grosses différences et c'est là souvent que le manque de compréhension de la mécanique interne pose problème.

Je vais donc laisser les gurus expliquer tout cela, bien mieux que moi. En anglais, off-course, mais l'informatique sans l'anglais, c'est comme le vélo sans les pédales, messieurs.

D'abord Ladislav Mecir qui a fait un très bon article sur la bindologie de R2 :
http://www.rebol.net/wiki/Bindology
Il avait été traduit au début, mais je sais qu'il a été révisé, donc la traduction n'est pas à jour :
http://pl.legoff.free.fr/dotclear/rdp/docs/_article_PDF/article_172.pdf

Enfin, Brian Hawley a fait une longue réponse sur Stackoverflow à propos des différences de contextes entre R2 et R3 :
http://stackoverflow.com/questions/14818324/what-is-the-summary-of-the-differences-in-binding-behaviour-between-rebol-2-and

évidemment, tout ça ne se digère pas comme les histoires drôles des magazines télé ! Alors prenez le temps de les lires et les relire tranquillement pour assimiler tout ça.
GreG18-Feb-2013/14:39:25+1:00
Très bien résumé, REBOL est effectivement orienté dialogues avec des contexts, ça fait partie des choses qui déroutent au début lorsque l'on est habitué aux objets.
yos19-Feb-2013/10:08:27+1:00
Salut,

On peux aussi au démarrage de rebol (dans le user.r par exemple) protéger tous les mots de system/words et ainsi durant les exécution de scripts ou de nos fonctions que l'on crée on sait si il y a des effets de bord sur des "variables" ou mots non déclarés dans le ou les scripts.

Par exemple la library de rebol.org affecte une couleur à son lancement et je pense qu'il y a pas mal de scripts dans ce cas.

A+

yos
dionysos19-Feb-2013/20:53:44+1:00
Content de voir que mon sujet à quand même était vu par quelqu'un

Ce n'était pas une question DideC mais une remarque et une opinion que je donnais. Opinion certe de quelqu'un de relativement nouveau dans le langage rebol. Apparemment ça ne s'applique pas à rebol, alors disons que c'est une opinion issue de réflexes de développeur...

Je vais relire tout ça de façon plus sérieuse histoire de me faire une opinion plus fondée car j'ai déjà lu le doc de Ladislav Mecir. Mais je n'ai pas fait le lien avec ta remarque.

Pour l'instant je ne comprends pas bien la distinction que vous faites (Variable et Word).
Il n'y a peut être pas de portée de variables car il n'y a pas de variables, alors qu'elle est la portée du mot? (le contexte il me semble)
Je reformule ma remarque en ne parlant plus de variable mais de portée du bind: Pourquoi le bind n'est pas local par défaut?

Il me semble qu'une fonction est à peu de chose près un contexte, pourtant la différence de portée est notable sur le bind.

>>f: func [][val: 1]
>> f
== 1
>> val
== 1

>>c: context [val2: 1]
>>cc: make c []
>>do c
>>do cc
>> test
** Script error: test has no value
DideC19-Feb-2013/21:56:07+1:00
Avec ton 1er exemple, on voit effectivement bien ce que l'on peut considérer comme un "défaut" de R2 : tout mot qui n'est pas explicitement déclaré comme local se retrouve dans le contexte global.

Si je conçoit ce langage et que je fais le raisonnement inverse : je décide que tous les mots sont locaux par défaut. Mais alors, comment je spécifie que le mot que j'utilise est à aller chercher globalement ?
Je me retrouve à déclarer dans mes fonctions les mots qui NE sont PAS locaux ! Il y a des centaines de langages, mais ça j'ai jamais vu.

Donc le choix est finalement plus logique : si je dis que le mot est local, il l'est, sinon il est à aller chercher dans les contextes parents.

Je parle bien de contexte "parent" car il peut y avoir un emboitement de contextes (comme les poupées russes).
g: "global"
c1: context [
  a: 1
  c2: context [
    b: 2
    c3: context [
      c: true
      c4: context [
        f: func [/local d] [d: now print [a b c d g]]
      ]
    ]
  ]
]

f
;** Script Error: f has no value
;** Where: halt-view
;** Near: f

c1/c2/c3/c4/f
;1 2 true 19-Feb-2013/21:51:16+1:00 global


En R3, il y a la fonction 'funct qui, à la différence de 'func, va déclarer localement tout les set-word!
Donc ton premier exemple s'il utilise 'funct dans R3 fonctionne.
yos20-Feb-2013/8:38:55+1:00
J'ai souvent penser manipuler les contexts courant comme les répertoires courants avec cd (change-directory) en ligne de commande.

Je ne sais pas si une telle commande cc (change-context permettant de changer le context global par defaut) au niveau natif de rebol serai un plus ou pas.

En tout cas bind m'a toujours permis de faire ce que je voulais y compris monter un context utilisateur au dessus de system/word pour le redéfinir le corriger ou le compléter.

A+

sam
coccinelle20-Feb-2013/9:19:43+1:00
Pour ce qui est de la portée, il me semble que pour les fonctions, Rebol n'est pas différent des autres langages.

Par exemple, Javascript a le même comportement, si la variable est déclarée explicitement, avec le "var", la portée est locale, sans le "var", la portée est global.

Rebol est pareil, si le mot est énuméré dans la liste /local, sa portée est locale, sinon elle est globale.

La syntaxe est différente, mais le principe est le même.

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2