[英]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.