Common Lisp: пустой список переменных для DO

Согласно HyperSpec, для его страницы на DO (выделено мной):

do принимает произвольное количество переменных итерации, которые связаны внутри итерации и выполняются параллельно.

И все же кажется, что DO не может принять пустой список переменных, такой как здесь:

(do (())
    ((cond n) (end-result))
  (cond-1..
  (cond-2..))

Правда ли, что DO не может принять пустой список переменных? Есть причина для этого? (Наверное, всегда есть LOOP).

Я запускаю SBCL.


person Soyuz    schedule 04.08.2012    source источник


Ответы (2)


Слишком много скобок. Это было бы:

(do () (condition return-value) forms)
person Community    schedule 04.08.2012
comment
Спасибо, жаль, что я никогда не думал об этом. Есть ли причина, по которой условия (()) (или (nil) в этом отношении) работают как бесконечный цикл? Именно по этой причине я подумал, что вам нужно поставить (()) или (nil) для списка переменных. - person Soyuz; 04.08.2012

Синтаксис для DO определен в стандарте Common Lisp:

do ({var | (var [init-form [step-form]])}*)
  (end-test-form result-form*)
  declaration*
 {tag | statement}*

Вы можете найти любой символ с помощью Common Lisp Hyperspec и найти синтаксис для специальных операторов и макросов.

Как видно из синтаксиса, Lisp ожидает список форм переменных. Это может быть либо переменная, либо список переменных, необязательная форма инициализации и необязательная форма шага. С этим синтаксисом вы можете использовать более одной переменной с DO.

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

person Rainer Joswig    schedule 04.08.2012