所以,我从读
setq和defvar在口齿不清 ,
http://www.cs.ucf.edu/courses/cop4020/spr2006/plsetup.html和
在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
好吧,我知道SETF应该用于更改现有变量的值,但未定义变量警告似乎在SBCL进行处理相当不错(虽然我已阅读,不同的CL实现可以进行不同处理这个问题,因此是不最好的事情)。
进入第二个测试:
CL-USER> (defun bar ()
(defvar y 15)
(print y))
; in: DEFUN BAR
; (PRINT Y)
;
; caught WARNING:
; undefined variable: Y
;
; compilation unit finished
; Undefined variable:
; Y
; caught 1 WARNING condition
BAR
CL-USER> y
; Evaluation aborted on #<UNBOUND-VARIABLE Y {10045033D3}>.
CL-USER> (bar)
15
15
CL-USER> y
15
按照链接,我改变了SETF来defvar我认为应该建立和可变一次性绑定。 现在我不确定变量警告被压入(打印Y)行...这到底是怎么回事呢?
作为一个次要的问题,我期待一个功能可按内assinged任何变量的值是无法访问的功能之外,由于是在Python的情况下:
>>> def foo():
... x = 10
... print x
...
>>> foo()
10
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
我猜这事做与方式Common Lisp的涉及范围,即defvar创建一个“全球特别variabe” ......所以,我想最后一次与(让...)
CL-USER>(defun定义的碱()(Y((10))(带有印记))(INCF 10)(带有打印内容))
; in: DEFUN BAZ
; (INCF Z 10)
; --> LET*
; ==>
; (SETQ Z #:NEW0)
;
; caught WARNING:
; undefined variable: Z
;
; compilation unit finished
; Undefined variable:
; Z
; caught 1 WARNING condition
而看完之后有什么defvar,defparameter,SETF和setq之间的区别 ,这其中似乎工作的权利:
CL-USER> (defun apple ()
(defparameter x 10)
(print 10))
APPLE
CL-USER> x
; Evaluation aborted on #<UNBOUND-VARIABLE X {1004436993}>.
CL-USER> (apple)
10
10
CL-USER> x
10
只是重申我的问题:1)什么是真正回事SETF,defvar和让?
2)有没有办法让Common Lisp的范围到一个函数内部的变量在Python的例子吗?