我看到实用的Common Lisp使用(defvar *db* nil)设立一个全局变量.是否可以setq用于同一目的?
使用defvarvs. 的优点/缺点是setq什么?
我发现了一个类似的问题.
但我不太明白这个解释.
所以我试图使用以下示例运行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]>
Run Code Online (Sandbox Code Playgroud)
我发现的完全一样.
我无法弄清楚它们有什么不同?
所以,我
在lisp中读过setq和defvar,
http://www.cs.ucf.edu/courses/cop4020/spr2006/plsetup.html,
在In Lisp中,如何解决"警告:假设特殊?"
关于setf和defvar之间差异的其他地方.所以我决定尝试一下这个想法:
CL-USER> (defun foo ()
(setf x 10)
(print x))
; in: DEFUN FOO
; (SETF X 10)
; ==>
; (SETQ X 10)
;
; caught WARNING:
; undefined variable: X
;
; compilation unit finished
; Undefined variable:
; X
; caught 1 WARNING condition
FOO
CL-USER> x
; Evaluation aborted on #<UNBOUND-VARIABLE X {10040F1543}>.
CL-USER> (foo)
10
10
CL-USER> x
10
Run Code Online (Sandbox Code Playgroud)
好吧,我知道setf应该用来改变现有变量的值,但是未定义的变量警告似乎在SBCL中得到了很好的处理(尽管我已经读过不同的CL实现可能会以不同方式处理它,因此它不是最好的事情).
输入第二个测试:
CL-USER> (defun bar ()
(defvar …Run Code Online (Sandbox Code Playgroud) 在这个文件中,我得到9个"假定特殊"的警告.他们是
;;;*** Warning in CHECK-ROW: CHECKARRAY assumed special in SETQ
;;;*** Warning in CHECK-ROW: RESULT assumed special in SETQ
;;;*** Warning in CHECK-ROW: CHECKARRAY assumed special
;;;*** Warning in CHECK-ROW: CHECKARRAY assumed special
;;;*** Warning in CHECK-ROW: CHECKARRAY assumed special
;;;*** Warning in CHECK-ROW: CHECKARRAY assumed special
;;;*** Warning in CHECK-ROW: CHECKARRAY assumed special
;;;*** Warning in CHECK-ROW: RESULT assumed special in SETQ
;;;*** Warning in CHECK-ROW: RESULT assumed special
Run Code Online (Sandbox Code Playgroud)
整个文件只有两个功能 -
(defun get-element (x y board)
(nth y (nth …Run Code Online (Sandbox Code Playgroud)