setq 常驻内存lisp_变量-Lisp中的setq和defvar

有几种引入变量的方法。

DEFVAR和DEFPARAMETER引入了全局动态变量。 *world*可以选择将其设置为某个值,除非已经定义。 *始终将其设置为提供的值。SETQ不引入变量。

(defparameter *number-of-processes* 10)

(defvar *world* (make-world)) ; the world is made only once.

请注意,您可能永远不想使用名称像*、DEFVAR、DEFPARAMETER、limit,...的变量*world*,...为什么? 因为这些变量将被声明为特殊变量,因此很难撤消。 特殊声明是全局的,对该变量的所有进一步使用将使用动态绑定。

坏:

(defvar x 10) ; global special variable X, naming convention violated

(defvar y 20) ; global special variable Y, naming convention violated

(defun foo ()

(+ x y)) ; refers to special variables X and y

(defun bar (x y) ; OOPS!! X and Y are special variables

; even though they are parameters of a function!

(+ (foo) x y))

(bar 5 7) ; -> 24

更好:始终在名称中使用*world*标记特殊变量!

(defvar *x* 10) ; global special variable *X*

(defvar *y* 20) ; global special variable *Y*

(defun foo ()

(+ *x* *y*)) ; refers to special variables X and y

(defun bar (x y) ; Yep! X and Y are lexical variables

(+ (foo) x y))

(bar 5 7) ; -> 42

局部变量由DEFUN,LAMBDA,LET,MULTIPLE-VALUE-BIND等引入。

(defun foo (i-am-a-local-variable)

(print i-am-a-local-variable))

(let ((i-am-also-a-local-variable 'hehe))

(print i-am-also-a-local-variable))

现在,默认情况下,除非声明为SPECIAL,否则上述两种形式的局部变量均为词法。 那么它们将是动态变量。

接下来,还有几种将变量设置为新值的形式。 SET,SETQ,SETF等。 *world*和*可以设置词汇变量和特殊(动态)变量。

对于可移植代码,必须设置一个已声明的变量。 标准未定义设置未声明变量的确切效果。

因此,如果您知道Common Lisp实现的作用,则可以使用

(setq world (make-new-world))

在顶层的“读取评估打印循环”中。 但是不要在代码中使用它,因为效果是不可移植的。 通常,*world*将设置变量。 但是某些实现可能在不知道变量SPECIAL的情况下也会声明它(CMU Common Lisp默认情况下会这样做)。 那几乎总是不是人们想要的。 如果您知道自己的工作,可将其用于临时用途,而不用于代码。

同样在这里:

(defun make-shiny-new-world ()

(setq world (make-world 'shiny)))

首先,应将此类变量写为*world*(带有*周围的字符),以表明它是全局特殊变量。 其次,它应该在之前用DEFVAR或DEFPARAMETER声明。

典型的Lisp编译器会抱怨未声明上述变量。 由于Common Lisp中不存在全局词法变量,因此编译器必须生成用于动态查找的代码。 然后,一些编译器会说,好吧,我们假设这是一个动态查找,我们将其声明为特殊-因为无论如何我们都假定这是。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值