簡體   English   中英

Elisp,而功能不起作用

[英]Elisp while function not working

我試圖在框架函數中編寫一個循環。 它應該很簡單,但是不能正常工作,這表明我不了解ELISP中的循環功能 我有以下內容:

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

當我對此進行評估時,會遇到無限循環。 到底是怎么回事?

刪除引號,將表格視為數據。 你也應該let -bind局部變量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))僅將自身返回為未評估的列表。

問題在於,在骨架中,“ quote”是特殊的,但僅在“ top-level”上。 即您需要將(while (< i 5) '(setq i (+ i 1)))更改為'(while (< i 5) (setq i (+ i 1)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM