gpt4 book ai didi

lisp - defvar、defparameter、setf 和 setq 之间有什么区别

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

我找到了一个 Similar question .

但是我不太明白那个解释。

所以我尝试使用以下示例运行 clisp:

  [1]> (defvar a 5)
A
[2]> (+ a 1)
6
[3]> (defparameter b 5)
B
[4]> (+ b 1)
6
[5]> (setf c 5)
5
[6]> (+ c 1)
6
[7]> (setq d 5)
5
[8]> (+ d 1)
6
[9]> (let ((a 500)) (+ a 1))
501
[10]> (let ((b 500)) (+ b 1))
501
[11]> (let ((c 500)) (+ c 1))
501
[12]> (let ((d 500)) (+ d 1))
501
[13]>

我发现的完全一样。

我不知道它们有什么不同?

最佳答案

DEFPARAMETER 总是分配一个值。所以:

[1]> (defparameter a 1)
A
[2]> (defparameter a 2)
A
[3]> a
2

DEFVAR 只执行一次,所以:

[4]> (defvar b 1)
B
[5]> (defvar b 2)
B
[6]> b
1

SETF 是内部使用SETQ 的宏,但有更多的可能性。在某种程度上,它是一个更通用的赋值运算符。例如。使用 SETF,您可以:

[19]> (defparameter c (list 1 2 3))
[21]> (setf (car c) 42)
42
[22]> c
(42 2 3)

但是你不能用 SETQ 做到这一点:

[23]> (setq (car c) 42)                                              
*** - SETQ: (CAR C) is not a symbol
The following restarts are available:
USE-VALUE :R1 Input a value to be used instead.
ABORT :R2 Abort main loop
Break 1 [24]> abort

关于lisp - defvar、defparameter、setf 和 setq 之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8927741/

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