相关疑难解决方法(0)

Lisp中的setq和defvar

我看到实用的Common Lisp使用(defvar *db* nil)设立一个全局变量.是否可以setq用于同一目的?

使用defvarvs. 的优点/缺点是setq什么?

lisp variables common-lisp variable-declaration assign

47
推荐指数
4
解决办法
2万
查看次数

Common Lisp范围(动态与词汇)

编辑:我在第一个答案后更改了示例代码,因为我提出了一个简单的版本,提出相同的问题.

我目前正在学习Common Lisp的范围属性.在我认为我有一个扎实的理解后,我决定编写一些我可以预测结果的例子,但显然我错了.我有三个问题,每个问题都与下面的例子有关:

例1:

(defmethod fun1 (x)
  (print x)
  (fun2))

(defmethod fun2 ()
  (print x))

(fun1 5)
Run Code Online (Sandbox Code Playgroud)

输出:

5 
*** - EVAL: variable X has no value
Run Code Online (Sandbox Code Playgroud)

问题:这是有道理的.x是静态范围的,fun2无法在没有显式传递的情况下找到x的值.

例2:

(defvar x 100)

(defmethod fun1 (x)
  (print x)
  (fun2))

(defmethod fun2 ()
  (print x))

(fun1 5)
Run Code Online (Sandbox Code Playgroud)

输出:

5
5
Run Code Online (Sandbox Code Playgroud)

问题:我不明白为什么x对fun2突然可见,其值为fun1,而不是值为100 ...

例3:

(setf x 100)

(defmethod fun1 (x)
  (print x)
  (fun2))

(defmethod fun2 ()
  (print x))

(fun1 5)
Run Code Online (Sandbox Code Playgroud)

输出:

5
100
Run Code Online (Sandbox Code Playgroud)

问题:我是否应该忽略这些结果,因为在未声明的变量上调用setf显然是未定义的?这恰好是我在第二个例子中所期望的......

任何见解将不胜感激......

lisp dynamic common-lisp scoping lexical

10
推荐指数
1
解决办法
2890
查看次数