LINUX.ORG.RU

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

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

Жуть какая... даже не знаю, с чего начать.

1. Отступы в лисп так не пишут. Скобка никогда не отрывается от относящегося к ней текста.

(defun while (condition body)
  ((eval body)
   (if (eval condition) (while condition body))))

(defvar *ein* 10)
(while '(not (= *ein* 0))
       '(- *ein* 1))

2. ((eval body) ...) писать нельзя. Первый элемент любого выражения должен быть либо именем функции, либо lambda-выражением. Исходя из контекста, предполагаю, что ты хотел выполнить (eval body) и (if ...) последовательно. Для этого есть форма progn. Должно быть

(defun while (condition body)
  (progn
    (eval body)
    (if (eval condition) (while condition body))))

или просто

(defun while (condition body)
  (eval body)
  (if (eval condition) (while condition body)))
defun — это тоже progn.

3. (while '(not (= *ein* 0)) '(- *ein* 1)) — это бесконечный цикл. Так как написано «пока не *ein* = 0, вычислить *ein* - 1». *ein* не меняется, значит никогда не станет равен нулю. Если ты хотел написать, «пока ... уменьшить *ein* на 1», то надо писать

(while '(not (= *ein* 0)) 
       '(setf *ein* (- *ein* 1)))
или
(while '(not (= *ein* 0)) 
       '(incf *ein* -1))

4. eval и списки как код используются очень редко. Правильным подходом было бы использовать аргументы-функции

(defun while (condition body)
  (funcall body)
  (if (funcall condition) (while condition body)))

(while (lambda () (not (= *ein* 0)))
       (lambda () (incf *ein* -1)))

Исправление monk, :

Жуть какая... даже не знаю, с чего начать.

1. Отступы в лисп так не пишут. Скобка никогда не отрывается от относящегося к ней текста.

(defun while (condition body)
  ((eval body)
   (if (eval condition) (while condition body))))

(defvar *ein* 10)
(while '(not (= *ein* 0))
       '(- *ein* 1))

2. ((eval body) ...) писать нельзя. Первый элемент любого выражения должен быть либо именем функции, либо lambda-выражением. Исходя из контекста, предполагаю, что ты хотел выполнить (eval body) и (if ...) последовательно. Для этого есть форма progn. Должно быть

(defun while (condition body)
  (progn
    (eval body)
    (if (eval condition) (while condition body))))

или просто

(defun while (condition body)
  (eval body)
  (if (eval condition) (while condition body)))
defun — это тоже progn.

3. (while '(not (= *ein* 0)) '(- *ein* 1)) — это бесконечный цикл. Так как написано «пока не *ein* = 0, вычислить *ein* - 1». *ein* не меняется, значит никогда не станет равен нулю. Если ты хотел написать, «пока ... уменьшить *ein* на 1», то надо писать

(while '(not (= *ein* 0)) 
       '(setf *ein* (- *ein* 1)))
или
(while '(not (= *ein* 0)) 
       '(incf *ein* -1))

4. eval и списки как код используются очень редко. Правильным подходом было бы использовать аргументы-функции

(defun while (condition body)
  (progn
    (funcall body)
    (if (funcall condition) (while condition body))))

(while (lambda () (not (= *ein* 0)))
       (lambda () (incf *ein* -1)))

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

Жуть какая... даже не знаю, с чего начать.

1. Отступы в лисп так не пишут. Скобка никогда не отрывается от относящегося к ней текста.

(defun while (condition body)
  ((eval body)
   (if (eval condition) (while condition body))))

(defvar *ein* 10)
(while '(not (= *ein* 0))
       '(- *ein* 1))

2. ((eval body) ...) писать нельзя. Первый элемент любого выражения должен быть либо именем функции, либо lambda-выражением. Исходя из контекста, предполагаю, что ты хотел выполнить (eval body) и (if ...) последовательно. Для этого есть форма progn. Должно быть

(defun while (condition body)
  (progn
    (eval body)
    (if (eval condition) (while condition body))))

3. (while '(not (= *ein* 0)) '(- *ein* 1)) — это бесконечный цикл. Так как написано «пока не *ein* = 0, вычислить *ein* - 1». *ein* не меняется, значит никогда не станет равен нулю. Если ты хотел написать, «пока ... уменьшить *ein* на 1», то надо писать

(while '(not (= *ein* 0)) 
       '(setf *ein* (- *ein* 1)))
или
(while '(not (= *ein* 0)) 
       '(incf *ein* -1))

4. eval и списки как код используются очень редко. Правильным подходом было бы использовать аргументы-функции

(defun while (condition body)
  (progn
    (funcall body)
    (if (funcall condition) (while condition body))))

(while (lambda () (not (= *ein* 0)))
       (lambda () (incf *ein* -1)))