Вот функция, которая задает число и возвращает значение, если его тип действительно число и еще раз выполняет функцию:Сложность понимания вложенных выражений в Лисп
(defun ask-number()
(format t "Please enter a number.~%")
(let ((val (read)))
(if (numberp val)
val
(ask-number))))
Я понимаю, что после того, как значение считывается, он обозначается как val
, а целое ((val (read)))
является аргументом let
. Я не понимаю, почему if-statement вложен в let
. Я предположил бы, что программа должна быть примерно такой:
(defun ask-number()
(format t "Please enter a number.~%")
(let ((val (read))))
(if (numberp val)
val
(ask-number)))
, который приводит к ошибке. Я не знаю, почему это происходит.
По аналогии с программой C, вы не могли бы сделать 'недействительным Foo (int x) {x = 3; } printf ("% d", x); "Эта переменная больше не находится в области видимости.' let' вводит область видимости, как это делает определение функции. Вы можете * сделать это, хотя: '(let ((val nil)) (set! val (read)) (если (числоp val) ...)) '. –