lisp 的变量 作用域是 lexical scoping 的
我们看看下面的代码:
CL-USER> (setf c 'global-c)
; in: SETF C
; (SETF C 'GLOBAL-C)
; ==>
; (SETQ C 'GLOBAL-C)
;
; caught WARNING:
; undefined variable: C
;
; compilation unit finished
; Undefined variable:
; C
; caught 1 WARNING condition
GLOBAL-C
CL-USER> (defvar *d* 'global-d)
*D*
CL-USER> (defun fn() *b*)
STYLE-WARNING: redefining COMMON-LISP-USER::FN in DEFUN
FN
CL-USER> fn
; Evaluation aborted on #.
CL-USER> (fn
)
GLOBAL-B
CL-USER> (let (( c 'local-c)
(*d* 'local-d))
(list c *d* (fn) (symbol-value 'c) (symbol-value '*d*)))
(LOCAL-C LOCAL-D GLOBAL-B GLOBAL-C LOCAL-D)
CL-USER>
看结果不解释
我们看看下面的代码:
CL-USER> (setf c 'global-c)
; in: SETF C
; (SETF C 'GLOBAL-C)
; ==>
; (SETQ C 'GLOBAL-C)
;
; caught WARNING:
; undefined variable: C
;
; compilation unit finished
; Undefined variable:
; C
; caught 1 WARNING condition
GLOBAL-C
CL-USER> (defvar *d* 'global-d)
*D*
CL-USER> (defun fn() *b*)
STYLE-WARNING: redefining COMMON-LISP-USER::FN in DEFUN
FN
CL-USER> fn
; Evaluation aborted on #.
CL-USER> (fn
)
GLOBAL-B
CL-USER> (let (( c 'local-c)
(*d* 'local-d))
(list c *d* (fn) (symbol-value 'c) (symbol-value '*d*)))
(LOCAL-C LOCAL-D GLOBAL-B GLOBAL-C LOCAL-D)
CL-USER>
看结果不解释
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/133735/viewspace-764845/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/133735/viewspace-764845/