- 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/
在 Practical Common Lisp 章节中 17. Object Reorientation: Classes Accessor Functions 部分,我发现很难理解 SETF 的扩展
我测试了《实用C++程序设计》一书中的代码。但是下面的例子并不像书上说的那样有效。我错过了什么?请帮忙。 #include int main() { int number = 0x3FF;
在使用 Common Lisp 进行开发时,我们可以通过三种方式来定义新的 setf 形式: 我们可以定义一个函数,其名称是两个符号的列表,第一个是 setf,例如(defun (setf some-
阅读 this question让我思考什么构成了表达式的有效汽车。显然,可以使用通常的语法“调用”符号和 lambda。根据hyperspec , function name n. 1. (in a
如果我像这样创建一个闭包, (let ((A (make-array '(10) :initial-element 5))) (defun h (i) (aref a i)) (
我正在使用动态变量,让我们调用其中一个值为 10 的 *x*。 我想通过将变量名作为参数传递给函数调用来更改它的值: (defun change-value (varname) (setf var
我正在 Common Lisp (CLISP) 中实现进化算法,但遇到了问题。 我有一个树状类: (defclass node () ((item :initarg :item :initform
船员, 我属于那种坚持使用 SETF 定义变量的类型。我已经升级到一台新机器(和一个新版本的 SBCL)并且它并没有让我摆脱这样做(自然地,我得到了适当的“==> undefined variable
目前正在学习 common lisp,遵循 Peter Seibel 的 Practical Common Lisp(我在第 11 章,关于集合),我很难理解 setf在引擎盖后面工作。 考虑到这个表
*mit = 13311 std::istringstream iss(*mit); double temp; iss.setf(ios::fixed, ios::floatfield); iss.p
我认为这在 Common Lisp 中是可能的(通过重载 setf),但不确定 Emacs Lisp。 我想做的是: (setf (local variable) value) (local ...)
为下面的变量执行 setf 的正确方法是什么? CG-USER(279): (defun LETTERSEARCH (string1 string2) (let ((newString nil))
我在我的脚本中定义了一个特殊变量 *unsorted-lst* 和一个用于重置此变量的函数: (defparameter *unsorted-lst* nil) (defun reset-to-uns
我知道我可以在 Common Lisp 中执行以下操作: CL-USER> (let ((my-list nil)) (dotimes (i 5) (setf my-l
我正在尝试编写一个函数,该函数将从列表中破坏性地删除 N 元素并返回它们。我想出的代码(见下文)看起来不错,除了 SETF 没有按我预期的方式工作。 (defun pick (n from) "D
假设我有两个变量,我想将值较小的变量设置为 nil。 有没有可能让它以这种方式工作? (setf a1 5) (setf a2 6) (setf (if ( (defparameter a1 5
上下文 根据我有限的 Common Lisp 经验,我发现像这样的代码并不罕见 (setf (gethash key table) (my-transformation (gethash
我试图在 Lisp 中编写“最接近”的函数,而不使用 setq/setf 等... 该函数找到给定向量的最近向量(在列表的列表中找到它)。 我试过了,但是没有套装太难了,非常感谢。 最佳答案 通常变量
在 Lisp 中,我定义了一个数组 a,然后让 b 等于 a。我现在想重新定义 b 的条目,使其等于 a 中的另一个条目,如下所示: (setf a (make-array '(2 2) :initi
以下代码生成从 1 到 n 的素数: (defun prime-list(n) (let ((a)(b)(x (floor (sqrt n)))) (loop for i from (fl
我是一名优秀的程序员,十分优秀!