2013-12-12 2 views
0

У меня есть небольшая проблема, чтобы понять, сделать в LISPПонимание Common Lisp сделать синтаксис

У меня есть этот код:

(defun iota-b (n) 
    (do ((x 0 (+1 x)) 
     (u '() (cons x u))) 
     ((> x n) (nreverse u)))) 

(йота-б 5)

(0 1 2 3 4 5)

В документации имеется базовый шаблон «сделать»:

(do (variable-definitions*) 
    (end-test-form result-form*) 
statement*) 

Я действительно не понимаю, где мое тело в моей функции йота-б Для меня это

(U «() (против Xu)))

по-видимому, нет, почему мы помещаем (u '() (cons xu))) в переменные-определения?

+0

Правильный отступ намечен на проблему. Я предлагаю не редактировать сообщение в отношении этого, потому что исходный отступ дает понять, где вопрос может возникнуть. –

+1

Это больше Lispy, чтобы бороться с круглыми скобками, чем сдаваться дьяволу и делать '(loop for x to 3 collect x)'? – Kaz

ответ

6

У вас есть определения переменных вида var init [step]

((x 0 (+1 x)) 
(u '() (cons x u))) 

это увеличивает x в каждой итерации и строит с (cons x u) в u списке как (5 4 3 2 1 0).

В конце теста

(> x n) 

В результате форма

(nreverse u) 

меняет список (5 4 3 2 1 0) к данному результату.

И тогда у вас есть пустое тело.

Вы, конечно, можете изменить сделать петлю для

(do ((x 0 (+1 x)) 
    (u '())) 
    ((> x n) (nreverse u)) 
    (setq u (cons x u))) 

это даст тот же результат.

+0

@Martialp Код в вашем вопросе не имеет отступов должным образом. Вы понимаете, что происходит после исправления отступа (нажмите «Tab» в любом хорошем редакторе)? – Gilles

+0

yep, я просто вижу это! ну, я думаю, я понимаю, THX много! – mpgn

2
(defun iota-b (n) 
    (do 
     ; var init step 
     ((x 0 (1+ x))  ; var 1 
     (u '() (cons x u))) ; var 2 

     ;test result 
     ((> x n) (nreverse u)) ; end ? 

    ; body comes here 
    ; this DO loop example has no body code 

    ))