[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [bep] learning lisp: symbol & binding



井上です。

Reiko TAKAHASHI <HFC03614@...> writes:

> (setq x 'y) → y
> (set x 10) → 10
> x → y
> y → 10
> 
> なので、2行目で(set x 10)とするまでは、xの値は10とは言えない……と思った
> んです。

上の4行で、xの値は1行目で指定した通り「シンボルy」です。
2行目はsetqでなくてsetなので、
xを評価した結果yに10を入れる、つまり
(setq y 10)
と同じ意味になります。
まあ、変数には数値や文字列だけでなくシンボルを入れることができるというこ
とで、たとえば.emacsに
(setq mew-pop-auth 'pass)
なんて書いていたのを思い出してください。mew-pop-authを評価するとpassとい
うシンボルになります。

>  tはずっとtのまま、nilはずっとnilのまま、みたいな意味でしょうか?

何回「評価」してもtはtということですね。数値10が何回評価しても10なのと同
じです。普通のシンボルはそうなっていません。もちろんそうさせることはでき
ますが。


> t と 't と "t" と ?t は違う意味を持っていますか?

まず、後ろ二つは全く別です。?tはシンボルじゃなくて「tという文字」だし、
"t"は「t1文字をちょうど含む大きさの箱(文字列)」です。
で、tと'tなのですが、これら二つを評価すると同じものになります。
tを評価すると(前に解説されているように)t自身になります。
'tを評価すると、クオートが1回とれてt自身になります。
ここまで見ると同じものかと思ってしまうのですが、たとえば
''''t
とtは違います。''''tの評価結果は'''tです。
 tというシンボルをmew-auto-getという変数にセットしたいとき、
tはシンボルなので、
(setq mew-auto-get 't)
と書くべきだと思いますが、tは評価してもtだと知っているので普通は
(setq mew-auto-get t)
と書く。
ということで身近になるでしょうか。
後、
シンボルは評価するとその束縛されている値がでてくるはずだけど、tとnilだけ
は数値や文字列をと同じように、評価してもそれ自身になる。
という説明も正しいかと思います。

> tとnilは、変数(関数?)ですか?

N高橋さんのメールにもあったように、シンボルは変数としての値と関数として
の値を持つことができます。
tとnilは変数として評価すると値(実は自分自身)が入っているので変数ですが、
関数としては定義されていないようです。
(t)
や
(nil)
はエラーになります。

# さて、そろそろご飯

-- 
                    Koichi Inoue, ARGV
                    E-Mail: inoue@...
                    ICQ UIN: 74900690