Проверка четных и нечетных значений в цикле с помощью Lisp - PullRequest
2 голосов
/ 12 июня 2019

Я не понимаю, почему следующая программа lisp отображает 15 строк вывода, а не 10:

(defparameter x 1)
(dotimes (x 10)
  (if (oddp x)
    (format t "x is odd~%"))
    (format t "x is even~%"))

Я использую CLISP 2.49 на компьютере с Windows 10.

Ответы [ 2 ]

7 голосов
/ 12 июня 2019

В дополнение к принятому ответу, обратите внимание, что с помощью редактора с автоматическим отступом (например, в Emacs) можно легко обнаружить такие ошибки.Ваш код автоматически отступает следующим образом:

(dotimes (x 10)
  (if (oddp x)
      (format t "x is odd~%"))
  (format t "x is even~%"))

Выражения if и второе format выровнены по вертикали (это братья и сестры в дереве с корнем в dotimes), тогда как вы хотите второе format произойдет, только если тест не пройден, на той же глубине, что и первый.

Замечание

Вы также можете указать некоторый код:

(format t 
        (if (oddp x) 
          "x is odd~%" 
          "x is even~%"))

Или даже:

(format t
        "x is ~:[even~;odd~]~%" 
        (oddp x))

Вышеприведенное опирается на условное форматирование .

6 голосов
/ 12 июня 2019

Ток:

(if (oddp x)
    (format t "x is odd~%"))    ; <- extra parenthesis
    (format t "x is even~%"))

Требуются:

(if (oddp x)
    (format t "x is odd~%")
    (format t "x is even~%"))

Вы экранируете форму if перед оператором else, поэтому оператор else всегда печатается, а оператор if печатается 5 раз.

...