这是一个函数,它询问一个数字,如果它的类型确实是一个数字则返回该值,否则再次执行该函数:
(defun ask-number ()
(format t "Please enter a number.~%")
(let ((val (read)))
(if (numberp val)
val
(ask-number))))
我理解在读取值后,它会被标记为val
,整个((val (read)))
是let
的参数。我不明白的是,为什么if语句嵌套在let
中。我原以为程序应该是这样的:
(defun ask-number ()
(format t "Please enter a number.~%")
(let ((val (read))))
(if (numberp val)
val
(ask-number)))
导致错误。我不确定为什么会这样。
答案 0 :(得分:4)
if
位于let
内的原因是您使用val
创建的let
仅在let
内有效;退出let
后,val
不再存在。
let
是用于创建和即时调用lambda
表达式的语法糖,因此您的let
表达式与以下内容基本相同:
((lambda (val)
(if (numberp val)
val
(ask-number)))
(read))