2009-08-26 1 views
0

http://www.rebol.org/ml-display-thread.r?m=rmlJNWSRebol, имитирующий неограниченные аргументы любого примера из сказанного здесь?

Graham писал:

Может ли функция имеет переменное число аргументов? Нет. Но вы можете имитировать его, используя «любой тип! спецификаторы функций и передача unset! как аргументы. Лучше использовать уточнения.

ответ

1

по умолчанию диалекте Rebol в (do диалекта) не поддерживает понятие вызова функции с переменным числом аргументов. Если вы хотите нарушить правило, столь же фундаментальное, как это, тогда вам нужен ваш собственный диалект. Ничто не мешает вам сделать:

tweet [Hello World How Are You Today?] 

Но идея использования word! вместо string! в этом случае немного изворотливые, так как многие общие твиты не действительны для Rebol парсер:

tweet [LOL! :)] 

Пренебрегая этой проблемой, обратите внимание, что по умолчанию вы не получите оценку выражения. Таким образом, диалект tweet должен будет выбрать способ показать, где вы хотите оценить. Вы можете использовать элементы получить слово, чтобы сделать подстановку переменных и скобки для более общих оценок:

>> 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 в примере Роуланда не возвращает блок. Не прямо, я имею в виду. Это, возможно, лучше понять скобки, и обращаясь к неявной «делать», что там на каждой интерпретации:

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

take-n работает только с одним параметром («N»), а затем возвращает функцию, которая принимает п параметров. Назовем эту функцию п, так что шаг один из этой оценки превращается в нечто эквивалентное:

do [f 1 2 3 4] 

Когда второй сделать пинки в, эта функция получает бежать ... и это возвращает блок. На практике я сомневаюсь, что вы захотите подсчитать такие параметры.

+0

Спасибо большое, что ваши ответы всегда продуманны, у меня будет длинный уик-энд, чтобы прочитать их все торопливо :) –

1

Ответ на этой странице:

да, функция может иметь переменное число аргументов. Do - такая функция, как, например, в:

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 возвращает блок, поэтому это один аргумент. На самом деле я не задал правильный вопрос, я скорее хочу написать что-то вроде tweet Hello World вместо твита «Hello World». Наконец-то я нашел способ. –

 Смежные вопросы

  • Нет связанных вопросов^_^