Elisp虽然功能不起作用

时间:2014-08-26 13:23:20

标签: emacs elisp

我正在尝试在骨架函数中编写循环。它应该非常简单但不起作用,并表明我不理解ELISP中的loop functions。我有以下内容:

(define-skeleton test
  ""
  ""
  '(setq i 1)
  (while (< i 5)
  '(setq i (+ i 1)))
  )

当我评估这个时,我得到一个无限循环。发生了什么事?

2 个答案:

答案 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)))