LINUX.ORG.RU

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

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

Во многих Лиспах это делается тривиально, к примеру -

(defmacro while-after (clause1 clause2 body)
    `(loop while ,clause1
        do ,body
        when (not ,clause2)
          do (return)))
Это макрос, он генерирует код и сразу исполняет. Символ «`» говорит о том, что выражения внутри скобок при генерации подставляются как есть. Знак "," говорит, что выражения при подстановке заменяются. То есть
(let ((a 1)) `(list :a ,a))
раскрывается в список (:a 1). Ещё есть ",@"

Примерчик:

(let ((p 0))
   (while-after (< p 10) (not (= p 0)) 
      (cond ((it-is-good-day? p) 
             (setf p (+ p 1)))
            (t (setf p 0)))))

Исправление pseudo-cat, :

Во многих Лиспах это делается тривиально, к примеру -

(defmacro while-after (clause1 clause2 body)
    `(loop while ,clause1
        do ,body
        when (not ,clause2)
          do (return)))
Это макрос, он генерирует код и сразу исполняет. Символ «`» говорит о том, что выражения внутри скобок при генерации подставляются как есть. Знак "," говорит, что выражения при подстановке заменяются. То есть
(let ((a 1)) `(list :a ,a))
раскрывается в список (:a 1). Ещё есть ",@"

Примерчик:

(let ((p 0))
   (while-after (< p 10) (not (= p 0)) 
      (cond ((it-is-good-day? p) 
             (setf p (+ p 1)))
            (t (setf p nil)))))

Исходная версия pseudo-cat, :

Во многих Лиспах это делается тривиально, к примеру -

(defmacro while-after (clause1 clause2 body)
    `(loop while ,clause1
        do ,body
        when (not ,clause2)
          do (return)))
Это макрос, он генерирует код и сразу исполняет. Символ «`» говорит о том, что выражения внутри скобок при генерации подставляются как есть. Знак "," говорит, что выражения при подстановке заменяются. То есть
(let ((a 1)) `(list :a ,a))
раскрывается в список (:a 1). Ещё есть ",@"