Passage d'un block en paramètre à une fonction
ZeBrain16-Jan-2009/19:56:28+1:00
Bonjour, prenons le code :

toto: [25 10 14]

renv: func [b [block!]]
[
 foreach Val b [ print Val + 1]
]


j'obtient:

** Script Error: Cannot use add on word! value
** Where: renv
** Near: print Val + 1


alors que la même opération sans mettre le tout dans une fonction marche. On dirait que Rebol ne considère pas les éléments du block passé en paramètre comme des entiers mais comme des mots. Y'as-til un moyen de résoudre ça ?
ZeBrain16-Jan-2009/20:59:52+1:00
bient sur j'appel la fonction par
renv [ toto ]
.
ZeBrain16-Jan-2009/21:12:21+1:00
bon on oublie, c'est pas mon jour.

Il suffit bien entendu d'appeler "renv toto" tout simplement.

Je crois que je vais changer de métier ...
guest216-Jan-2009/23:34:48+1:00
ahahah... achète toi un nouveau brain !
Bertrand17-Jan-2009/12:11:14+1:00
Parfois avec Rebol, il arrive qu'on débloque un peu
Bertrand27-Jan-2009/18:45:41+1:00
Sans rire, je viens de me rendre compte que j'ai fait le même genre de bêtise, depuis des mois, sur cet exemple (que je suis allé pêcher je n'sais-plus-z-où) :
bloc: ["a" "b" "c"]
code: [print e]
foreach e bloc [do code]
** Script error : e has no value


... et, après avoir essayé plusieurs combinaisons (sauf la bonne), j'en avais conclu que ça ne pouvait pas fonctionner en Rebol (alors que ça marchait bien avec NewLISP et divers Logos et Basics) ...

... jusqu'à ce que, récemment, et sans doute inconsciemment grâce à ce post, je me rende compte qu'il fallait juste faire:
bloc: ["a" "b" "c"]
code: [print e]
foreach e bloc code
a
b
c


Puisque foreach n'attendait simplement qu'un bête bloc à évaluer, bloc contenu dans 'code'. Alors qu'avec d'autres langages de prog., il faut en général évaluer explicitement la variable 'code' (par un 'eval' ou un 'run' ou un 'execline' ou autre).

Finalement c'est plus simple avec Rebol!
Didec28-Jan-2009/12:01:57+1:00
Tout à fait Bertrand.

Pour finir la leçon, il faut quand même expliquer pourquoi ça ne fonctionnait pas avec ton premier code. Après tout ça aurait pu !

C'est un problème de contexte.
Quand Rebol interprète "code: [print e]", il créé un contexte avec le mot 'e.
Mais foreach, lui aussi créé un contexte avec le mot 'e dans lequel il "bind" son block de code. Ce contexte est différent de celui de 'code, d'où l'erreur "e has no value" ce qui est vrai dans le contexte de 'code.

Pour bien s'en rendre compte, il suffit de définir 'e avant 'code. Là comme 'e existe lors de la création de 'code, Rebol fait référence à ce 'e du contexte globale (tout comme il le fait avec 'print). La preuve :
e: "toto"
bloc: ["a" "b" "c"]
code: [print e]
foreach e bloc [do code]
toto
toto
toto

==> Ce n'est pas le même 'e dans 'code ('e du contexte globale) et dans le block du 'foreach ('et du block 'foreach).

Si toutefois, on compose un block de code à la volé et que l'on a réellement besoin de l'exécuter par 'do dans le 'foreach, il faut au préalable le "binder" dans le contexte du 'foreach :
e: "toto"
bloc: ["a" "b" "c"]
code: [print e]
foreach e bloc [do bind code 'e]
a
b
c
Bertrand28-Jan-2009/16:23:54+1:00
Waow ! Merci pour la leçon ... qui me fait dire que Rebol n'est certainement pas qu'un "toy language" (ou quelque chose comme ça), comme je l'ai lu quelque part sur le web. On peut vraiment apprendre à programmer avec Rebol, qui exploite et optimise pas mal de concepts de programmation (anciens et nouveaux) d'une manière simple et pratique.

Il y a encore quelques temps j'avais un penchant pour NewLISP (et je l'apprécie encore), sans doute à cause de l'aura de LISP et de SCHEME. NewLISP et Rebol ont pas mal de choses en commun, mais, au niveau du graphisme et des interfaces graphiques (et parfois, de la syntaxe), je trouve Rebol plus pratique, plus simple à utiliser et peut-être plus clair. D'autant plus que je commence à mieux comprendre sa logique, sa cohérence et certaines notions, comme, par exemple, la notion de 'contexte' exposée ici...

Il faudrait encore que j'expérimente un peu plus avec 'bind' pour mieux comprendre ses applications pratiques.

Merci

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2