2009-08-26 1 views

Répondre

1

dialecte par défaut de Rebol (le dialecte do) ne supporte pas l'idée d'un appel à une fonction ayant un nombre variable d'arguments. Si vous voulez enfreindre une règle aussi fondamentale que cela, vous avez besoin de votre propre dialecte. Rien ne vous empêche de faire:

tweet [Hello World How Are You Today?] 

Mais l'idée d'utiliser word! au lieu de string! dans ce cas est un peu louches, autant de tweets communs ne sont pas valides pour l'analyseur Rebol:

tweet [LOL! :)] 

En négligeant ce problème, notez que par défaut vous n'obtiendrez aucune évaluation d'expression. Donc, ce dialecte tweet devrait choisir un moyen de montrer où vous voulez une évaluation. Vous pouvez utiliser des éléments get-mots pour faire une substitution de variables, et les parenthèses pour les évaluations plus générales:

>> a: 10 
>> b: 20 
>> tweet [When you add :a and :b you get (a + b), LOL ":)"] 
"When you add 10 and 20 you get 30, LOL :)" 

BTW, take-n dans l'exemple de Rowland ne retourne pas un bloc. Pas directement, je veux dire. Il est peut-être mieux compris avec des parenthèses, et en adressant l'implicite « faire » qui est là sur toutes les interprétations:

do [do (take-n 4) 1 2 3 4] 

take-n fonctionne avec un seul paramètre (le « n »), puis retourne une fonction qui prend des paramètres n. Appelons cette fonction f, si la première étape de cette évaluation se transforme en quelque chose d'équivalent à:

do [f 1 2 3 4] 

Lorsque la deuxième faire des coups de pied dans, cette fonction Exécuter ... et obtient il est de retour d'un bloc. En pratique, je doute que vous vouliez compter les paramètres comme celui-ci.

+0

Merci beaucoup hostilefork vos réponses sont toujours réfléchies, j'aurai un long week-end pour les lire toutes :) –

1

La réponse sur cette page est:

oui, une fonction peut avoir un nombre variable d'arguments. Do est une telle fonction, par ex. dans:

take-n: func [n /local spec] [ 
    spec: copy [] 
    for i 1 n 1 [ 
     append spec to word! append copy "a" to string! i 
    ] 
    func spec reduce [:reduce append reduce [to lit-word! append copy "take" to string! n] spec] 
] 
do take-n 4 1 2 3 4 
== [take4 1 2 3 4] 
+0

take-n renvoie un bloc, donc c'est un argument. En fait, je n'ai pas posé la bonne question, je veux plutôt pouvoir écrire quelque chose comme tweet Hello World au lieu de tweeter "Hello World". Enfin j'ai trouvé un moyen. –

Questions connexes