gpt4 book ai didi

lisp - LET 和 SETQ 的区别?

转载 作者:太空宇宙 更新时间:2023-11-03 18:32:29 26 4
gpt4 key购买 nike

我正在使用 GCL 在 Ubuntu 上编程。从各种来源的 Common Lisp 文档中,我了解到 let 创建 local 变量,而 setq 设置 existing< 的值/em> 变量。在以下情况下,我需要创建两个变量并对它们的值求和。

使用setq

(defun add_using_setq ()
(setq a 3) ; a never existed before , but still I'm able to assign value, what is its scope?
(setq b 4) ; b never existed before, but still I'm able to assign value, what is its scope?
(+ a b))

使用let

(defun add_using_let ( )
(let ((x 3) (y 4)) ; creating variables x and y
(+ x y)))

在这两种情况下,我似乎都取得了相同的结果;这里使用setqlet有什么区别?为什么我不能在所有需要使用 let 的地方使用 setq(因为它在语法上很简单)?

最佳答案

setq 分配一个值给一个变量,而 let 引入新的变量/绑定(bind)。例如,看看

中发生了什么
(let ((x 3))
(print x) ; a
(let ((x 89))
(print x) ; b
(setq x 73)
(print x)) ; c
(print x)) ; d


3 ; a
89 ; b
73 ; c
3 ; d

外层 let 创建了一个局部变量 x,而内层 let 创建了另一个覆盖内部变量的局部变量。请注意,使用 let 隐藏变量不会影响被隐藏变量的值; d 行中的x 是外部let 引入的x,它的值没有改变。 setq 只影响调用它的变量。此示例显示 setq 与局部变量一起使用,但它也可以与特殊变量一起使用(意思是动态作用域,通常用 defparameterdefvar:

CL-USER> (defparameter *foo* 34)
*FOO*
CL-USER> (setq *foo* 93)
93
CL-USER> *foo*
93

请注意,setq 不会(可移植地)创建 变量,而 letdefvardefparameter, &c.做。 setq 的行为在使用不是变量的参数调用时(尚未)未定义,并且由实现来决定做什么。比如SBCL大声提示:

CL-USER> (setq new-x 89)

; in: SETQ NEW-X
; (SETQ NEW-X 89)
;
; caught WARNING:
; undefined variable: NEW-X
;
; compilation unit finished
; Undefined variable:
; NEW-X
; caught 1 WARNING condition
89

当然,更好地理解这些概念的最佳方法是阅读和编写更多的 Lisp 代码(随着时间的推移),阅读 HyperSpec 中的条目并遵循交叉引用,尤其是词汇表条目。例如,HyperSpec 对 setqlet 的简短描述包括:

  • SETQ

    Assigns values to variables.

  • LET

    let and let* create new variable bindings and execute a series of forms that use these bindings.

您可能想阅读有关变量和绑定(bind)的更多信息。 letlet* 也有一些动态变量和 special 声明的特殊行为(但你可能不需要知道这些while),并且在某些情况下(您可能暂时不需要了解)当变量实际上不是变量时,setq 实际上等同于 setf。 HyperSpec 有更多详细信息。

尽管如此,Stack Overflow 上有一些不太重复的问题可能有助于理解 Common Lisp 中可用的各种变量定义和赋值运算符的使用:

关于lisp - LET 和 SETQ 的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19067632/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com