LINUX.ORG.RU

История изменений

Исправление loz, (текущая версия) :

Так а зачем ты body в последнем вызове раскрываешь?

(defmacro while (condition body)
  `(progn ,body
          (when ,condition
            (while ,condition ,body))))


CL-USER> (defvar *var* 3)
*VAR*
CL-USER> (while (plusp *var*) (progn (format t "var: ~a~&" *var*) 
                                     (decf *var*)))
var: 3
var: 2
var: 1
NIL

CL-USER> (macroexpand-1 '(while (plusp *var*) (progn (format t "var: ~a~&" *var*) 
                                                     (decf *var*))))
(PROGN
 (PROGN (FORMAT T "var: ~a~&" *VAR*) (DECF *VAR*))
 (WHEN (PLUSP *VAR*)
   (WHILE (PLUSP *VAR*) (PROGN (FORMAT T "var: ~a~&" *VAR*) (DECF *VAR*)))))
T


Исходная версия loz, :

Так а зачем ты body в последнем вызове раскрываешь?

(defmacro while (condition body)
  `(progn ,body
          (when ,condition
            (while ,condition ,body))))


CL-USER> (defvar *var* 3)
*VAR*
CL-USER> (while (plusp *var*) (progn (format t "var: ~a~&" *var*) 
                                     (decf *var*)))
var: 3
var: 2
var: 1
NIL