- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以,我从
setq and defvar in lisp ,
http://www.cs.ucf.edu/courses/cop4020/spr2006/plsetup.html , 和
In Lisp, how do I fix "Warning: Assumed Special?"
在其他地方关于 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
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
>>> 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
; 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
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
最佳答案
接听 2) DEFVAR
定义一个变量。但它没有被执行。所以编译器不知道 print
中的变量。表格 - 编译 DEFUN
时形式.. 它也在 DEFUN
内.因此它不在顶层。作为顶级形式,编译器将识别 DEFVAR
并且会注意到 y
是一个全局特殊变量。
Just to reiterate my questions: 1) what is really going on with setf, defvar and let? 2) is there a way to get common lisp to scope the variables inside a function as in the python example?
SETF
设置一个变量值,但不定义它。如果该变量未定义,那么 Common Lisp 标准并没有真正说明会发生什么。大多数 Common Lisp 实现都会做一些有用的事情。通常它会像变量被声明为特殊一样被执行(因此您也会收到警告)。
DEFVAR
用作定义全局特殊变量的顶级形式(通常不在函数内部)。由于
DEFVAR
声明变量名是特殊的,写一个带有星号的变量是一个非常有用的约定:
*y*
而不仅仅是
y
.
LET
定义局部变量的范围。
LET
.
>>> def foo():
... x = 10
... print x
(defun foo ()
(let ((x 10))
(print x)))
LET
反而。
LET
是语法糖,主要是:
(let ((a 1) (b 2)) (+ a b))
与
((lambda (a b) (+ a b)) 1 2)
基本相同.它只是一个简单的函数应用程序,以不同的方式编写,以改进它以供人类读者使用。
(defun foo (&aux (x 10))
(print x))
X
, 就像
LET
会做。
关于variables - 使用 setf、defvar、let 和范围分配变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14314834/
Def[Type] VBA 支持从 Hell 生成的语句,似乎是为了强制执行某种 Systems Hungarian符号。 例如: Option Explicit DefBool B DefLng I
Warning Tips - GNU Emacs Lisp Reference Manual 中的第一个提示: Try to avoid compiler warnings about undefin
所以,我从 setq and defvar in lisp , http://www.cs.ucf.edu/courses/cop4020/spr2006/plsetup.html , 和 In Li
我使用的代码是这样的: (defvar my-defvar "test") (completing-read "input: " '("1" "2" my-defvar)) 然后是M-x eval-r
我看到 Practical Common Lisp使用 (defvar *db* nil) 设置一个全局变量。为同样的目的使用 setq 不是可以吗? 使用 defvar 与 setq 有什么优点/缺
我找到了一个 Similar question . 但是我不太明白那个解释。 所以我尝试使用以下示例运行 clisp: [1]> (defvar a 5) A [2]> (+ a 1)
我找到了一个 Similar question . 但是我不太明白那个解释。 所以我尝试使用以下示例运行 clisp: [1]> (defvar a 5) A [2]> (+ a 1)
我有一个移动到行尾的函数,但是当已经在行尾时,返回到之前调用它的最后一点。 这需要将最后一个点的值存储在某处。目前我将这一点存储在例如 (defvar last-point 1) 中,但我认为封装会更
我的 .emacs 中有以下设置 ... (defvar org-dir "/home/mash/read/org/") 并在...周围使用它 (setq org-directory org-dir)
在一些文档中,我发现他们说答案是 *var* 表示全局变量。 但是当我尝试时,我无法确定这一点。 FIRST-PACKAGE[27]> (defvar b 1) B FIRST-PACKA
下面的 emacs lisp 文件是关于当 Alice 在她的 init 文件中使用词法绑定(bind)的局部变量 foo 并且 Bob 将 foo 定义为全局特殊变量时会发生什么defvar 在他的
下面的函数来自Org Mode - Organize Your Life In Plain Text!它在 emacs-23.4-r1 中不起作用。但是,如果我删除 bh/organization-t
我是一名优秀的程序员,十分优秀!