2017-01-05 16 views

答えて

4

あなたがaは何か他のものを指し作るすなわち、aがバインドされている内容を変更することができます

(let ((a 5)) (setf a 10)) 

aによって参照値が可変である場合、あなたはそれを変異させることができます。

(let ((a (list 5))) (setf (first a) 10)) 

defparameterのように変更可能か、またはdefvarの場合のように定数ですか?

いいえ、DEFVARは定数を定義していません。その後

(defvar *var* :value) 
(setf *var* 5) 

:何が起こることは、あなたがDEFVARフォームを評価するとき、それはシンボルがすでにバインドされている最初のかどうかをチェックするということです

*var* 
=> 5 

。この場合、既存の値がそのまま保持されます。一方、DEFPARAMETERは常に変数を再初期化します。

0

これを明確にするいくつかの例があります。あなたはreplで彼らを試すことができます。うまくいけば、これらの例は、あなたがletが何をするかの良いアイデアを得るのを助ける必要があります彼らはより多くのdefvardefparameter

(loop repeat 2 do 
    (let ((a 1)) (print a) (setf a 5) (print a))) 

(loop repeat 2 do 
    (let ((a (list 1 2))) 
    (print (first a)) 
    (setf (first a) 5) 
    (print (first a)))) 

(loop repeat 2 do 
    (let ((a '(1 2))) 
    (print (first a)) 
    (setf (first a) (+ (first a) 5)) 
    (print (first a)))) 

のようなものかどうかを考えるようにしてください。 replに3番目の例を入れるとどうなるのかは実際には実装に依存しており、letとはほとんど関係がなく、quoteとはるかに関係しています。

関連する問題