难以理解Lisp中的嵌套表达式

时间:2014-10-03 14:02:56

标签: lisp common-lisp let

这是一个函数,它询问一个数字,如果它的类型确实是一个数字则返回该值,否则再次执行该函数:

(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)))

导致错误。我不确定为什么会这样。

1 个答案:

答案 0 :(得分:4)

if位于let内的原因是您使用val创建的let仅在let内有效;退出let后,val不再存在。

let是用于创建和即时调用lambda表达式的语法糖,因此您的let表达式与以下内容基本相同:

((lambda (val)
   (if (numberp val)
       val
       (ask-number)))
 (read))