【问题标题】:Is the variable defined by a let mutable in Common Lisp?在 Common Lisp 中,变量是由 let 可变定义的吗?
【发布时间】:2017-05-20 11:42:24
【问题描述】:

例如在 Common Lisp 中的 let

(let ((a 5)) (print a))

adefparameter 一样是可变的,还是 adefvar 一样是恒定的?

【问题讨论】:

  • 常量是用DEFCONSTANT创建的,而不是DEFVAR

标签: lisp common-lisp let


【解决方案1】:

您可以更改 a 绑定的内容,即使 a 引用其他内容:

(let ((a 5)) (setf a 10))

如果a引用的值是可变的,你可以改变它:

(let ((a (list 5))) (setf (first a) 10))

是像 defparameter 一样是可变的,还是像 defvar 一样是常量?

不,DEFVAR 没有定义常量。

(defvar *var* :value)
(setf *var* 5)

然后:

*var*
=> 5

当您评估DEFVAR 表单时会发生什么情况,它首先检查该符号是否已绑定。如果是这种情况,则保留现有值。另一方面,DEFPARAMETER 总是重新初始化变量。

【讨论】:

    【解决方案2】:

    这里有一些例子可以说明这一点。你可以在 repl 上试试。试着想想他们更像defvar还是defparameter

    (loop repeat 2 do
      (let ((a 1)) (print a) (setf a 5) (print a)))
    
    (loop repeat 2 do
      (let ((a (list 1 2)))
        (print (first a))
        (setf (first a) 5)
        (print (first a))))
    
    (loop repeat 2 do
      (let ((a '(1 2)))
        (print (first a))
        (setf (first a) (+ (first a) 5))
        (print (first a))))
    

    希望这些示例可以帮助您更好地了解 let 的作用。当您将第三个示例放入 repl 时会发生什么实际上取决于实现,与 let 几乎没有关系,而与 quote 有更多关系。

    【讨论】:

      猜你喜欢
      • 2019-09-29
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多