2009-10-09 5 views
1

Je souhaite créer une fonction générique do-libs pour charger automatiquement un groupe de bibliothèques répertoriées dans les fichiers d'en-tête rebol. Je veux rendre le paramètre optionnel mais dans ce dernier cas cela ne fonctionne pas pourquoi?Paramètre Rebol et unset (facultatif)

Rebol[ 
    libs: [  
    lib1/lib11.r 
    lib1/lib12.r 
    lib2/lib21.r 
    ] 
] 
do-libs 'libs ; works 
do-libs ; doesn't work 

avec:

do-libs: func[libs [word! unset!]][ 

    if/else value? 'libs [ 
    foreach lib system/script/header/:libs [ 
     if/else file? lib [ 
     do lib 
     ][  
     do file: to-rebol-file mold lib 
     ]  
    ] 
    ][ 
    ;case with no parameter 
    do-libs 'libs 
    ] 
] 
+0

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. –

+0

Salut merci va l'essayer alors: ne l'ai jamais fait jusqu'à présent! –

Répondre

1

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")
+0

Salut merci beaucoup. Eh bien, je sais que je devrais utiliser des raffinements, c'est juste que je veux comprendre pourquoi :) Parce que cet exemple http: // reboltutorial.com/blog/optional-parameter/fonctionne et je n'ai pas utilisé un argument littéral. –

+0

La raison pour laquelle je passe 'libs au lieu de lib est que je ne veux pas être obligé de citer la lib comme "lib1/lib11.r" –

+1

Dans R3 vous ne pouvez pas faire l'omission de l'argument sauf si elle est citée, mais dans R2 vous pouvez. (J'ai trouvé cette question parce que je me demandais comment la fonction viewtop fonctionnait dans R2 même si aucun paramètre url n'était fourni.) Je ne comprends pas le point de permettre cela, en utilisant des raffinements est plus cohérent. – HostileFork

Questions connexes