我正在學習通用lisp並試圖實現交換值函數來交換兩個變量的值。爲什麼以下不起作用?如何在lisp中執行值賦值問題
(defun swap-value (a b)
(setf tmp 0)
(progn
((setf tmp a)
(setf a b)
(setf b tmp))))
錯誤信息:
in: LAMBDA NIL
; ((SETF TMP A) (SETF A B) (SETF B TMP))
;
; caught ERROR:
; illegal function call
; (SB-INT:NAMED-LAMBDA SWAP-VALUE
; (A B)
我不知道Common Lisp的足夠好,告訴你爲什麼你得到的錯誤,但我可以告訴你,這不會交換兩個變量的值,即使你修正這個錯誤,因爲參數'交換-value'是按值傳遞的,所以它們不會影響調用之外的綁定。 '(swap-value x y)'會傳入x和y的值,對'x'綁定的內容沒有影響。爲了達到你想要的效果,你將不得不寫一個宏。 – dfan 2011-04-07 01:31:49
不錯的一點。讓我感到驚訝的是,我認爲setf是全球範圍內的分配者。我仍然堅持C程序員的思維。任何人都可以詳細說明Lisp的做價值分配的方法嗎? – lkahtz 2011-04-07 01:44:38
'setf'是Lisp做值賦值的方式,但它不是引入全局變量的方法。你應該使用'defvar'或'defparameter'來引入全局的(和特殊的,也就是動態變量)。這是一個有點太複雜了一條註釋解釋,但檢查出實用的Common Lisp:http://www.gigamonkeys.com/book/variables.html – spacemanaki 2011-04-07 01:56:09