我正在尝试在骨架函数中编写循环。它应该非常简单但不起作用,并表明我不理解ELISP中的loop functions。我有以下内容:
(define-skeleton test
""
""
'(setq i 1)
(while (< i 5)
'(setq i (+ i 1)))
)
当我评估这个时,我得到一个无限循环。发生了什么事?
答案 0 :(得分:2)
删除引号,将表单视为数据。您还应该let
- 绑定您的本地变量i
,否则它将绑定一个全局变量。你需要评估:
(define-skeleton test
"A test skeleton."
(let ((i 1))
(while (< i 5)
(setq i (1+ i))))) ; (incf i) would also work
更多详细信息:(setq i (1+ i))
是一个列表((1+ i)
也是如此),但读者知道将其视为一种表单,用于评估列表中的第一项是函数调用的时间,宏或特殊形式(如if
)。当您引用列表时(通过在'
之前添加或将其包装在(quote ...)
中),它会告诉读者将整个列表视为数据,并将其返回到未评估状态。
因此,(setq i (1+ i))
将i
绑定到值1加上之前的i
值,(setq i '(1+ i))
将i
绑定到(1+ i)
未评估的列表'(setq i (1+ i))
,而{{1}}只是将自己作为未评估的列表返回。
答案 1 :(得分:0)
问题在于,在骷髅中,&#34;引用&#34;很特别,但仅限于&#34;顶级&#34;。即您需要将(while (< i 5) '(setq i (+ i 1)))
更改为'(while (< i 5) (setq i (+ i 1)))
。