【问题标题】:Difficulty understanding nested expressions in Lisp难以理解 Lisp 中的嵌套表达式
【发布时间】:2014-11-28 14:24:27
【问题描述】:

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

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

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

【问题讨论】:

    标签: lisp common-lisp let


    【解决方案1】:

    iflet 内的原因是您使用let 创建的val 仅在let 内有效;一旦你退出letval 就不再存在了。

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

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

    【讨论】:

    • 与 C 程序类比,你不能像函数定义那样使用 void foo(int x) { x = 3; } printf("%d", x);" The variable is no longer in scope. let` 引入作用域。不过,您可以这样做:(let ((val nil)) (set! val (read)) (if (numberp val) ...)).
    猜你喜欢
    • 2021-12-17
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 2019-05-17
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多