defvar,defparameter,setf和setq有什么区别 [英] What's difference between defvar, defparameter, setf and setq

查看:88
本文介绍了defvar,defparameter,setf和setq有什么区别的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我找到了类似问题.

但是我不太理解这个解释.

But I don't quite understand that explanation.

因此,我尝试使用以下示例运行clisp:

So I'm trying to run clisp with the following example:

  [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]> 

我发现的完全一样.

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

I can't figure out what's different with them?

推荐答案

DEFPARAMETER始终分配一个值.所以:

DEFPARAMETER always assigns a value. So:

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

而DEFVAR仅执行一次,所以:

while DEFVAR does it only once, so:

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

SETF是在内部使用SETQ的宏,但具有更多的可能性.从某种意义上说,它是一个更通用的赋值运算符.例如.使用SETF,您可以执行以下操作:

SETF is a macro which uses SETQ internally, but has more possibilities. In a way it's a more general assignment operator. E.g. with SETF you can do:

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

但是您不能使用SETQ:

but you can't do that with 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

这篇关于defvar,defparameter,setf和setq有什么区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆