Je ne suis pas un expert dans ce domaine, mais mon comprendre est que pour créer une fonction qui permet une omission d'argument, il doit être un argument littéral , par exemple,
do-libs: func [ 'libs [word! unset!] ] [
; blah blah
]
Notez que l'argument libs est un lit-word!
. Cela signifie également que vous devez appeler cette fonction comme suit:
do-libs libs
OU
do-libs
Cependant, soyez prudent. REBOL ne respecte pas les nouvelles lignes. Si vous dites:
do-libs
3
Il considérera 3 comme argument pour do-libs
et votre appel de fonction échouera. Si vous dites
do-libs
print "ok"
Il considérera print
comme argument 'libs
de do-libs
. En fait, REBOL interprète ce qui précède que
(do-libs print) "ok"
L'essentiel est que l'omission de l'argument est prévu pour le mode interactif de REBOL. Vous ne devriez pas l'utiliser pour faire ce que vous essayez de faire. Au lieu de cela, votre fonction doit probablement ressembler à ceci:
do-libs: func [ /name 'word [word!] ] [
if none? name [ word: 'libs ]
; and so on
]
Maintenant, vous pouvez dire
do-libs
OU
do-libs/name foo
Ceci est plus REBOL naturelle, idiomatiques. En général, les raffinements doivent être utilisés pour transmettre des arguments facultatifs. Lorsque le nombre d'arguments est potentiellement inconnu ou illimité, un block!
doit être utilisé. En raison du fonctionnement de l'interpréteur REBOL, il est très peu probable que REBOL prenne en charge les arguments de style "param array" que possèdent beaucoup d'autres langages (C, C++, Ruby, etc.). L'interpréteur n'aurait aucun moyen de savoir où se termine la liste d'arguments, sauf si l'expression entière était placée entre parenthèses comme suit:
(foo 1 2 3 "a" "b" "c")
Je suis passé à l'utilisation complète de R3 maintenant. C'est au point où il est utilisable pour tout ce dont j'ai besoin, et son système de module est vraiment génial. –
Salut merci va l'essayer alors: ne l'ai jamais fait jusqu'à présent! –