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

Re: [bep] learning lisp: cons



n高橋です。

Reiko TAKAHASHI  (高橋玲子)writes:

> } (car '(a b)) と (car '(a . b)) はどちらも a で同じになりますが、
> } (cdr '(a b)) と (cdr '(a . b)) は前者が (b) 、後者が b と別になります
> } ので注意して下さい。

>  これは、(car)がリストの先頭「要素」を返すのに対して、(cdr)はあるリスト
> から先頭要素を除いた残りの「リスト」を返すから、ということですね?

そのとおりです。ここは重要なポイントです。試験に出るから覚えておくよう
に。(嘘)

>  .emacsの、たとえばメールアカウントの情報を書くところは、リストですよね
> ……?

使うメーラによって ~/.emacs の書き方が違うと思うので、これは何とも言え
ません。多分 Mew の話だと思うのですが、なにぶん私が Mew を知らないもの
で…。済みません。

> そこでは(cons)は使われていなくて、全部(setq)でdotted pairが作られていると
> 思うのですが、わざわざ(cons)を使う場合と、(setq)だけでいい場合とはどう違
> うのでしょう?

具体的なコードがわからないので想像なのですが、

(setq x (cons a b))

とは書かれてなくて、

(setq x '(a . b))

のようになっている、ということですか?  そうだとすると答えは、「cons を
使えば変数が使えるが、consを使わない場合は、定数同士の dotted pair し
か作れない」ということになります。

例を出しましょう。数を一個受け取り、その数と、その数に1を足した数の 
dotted pair を返す関数を考えます。

(defun plus-one (n)
  (cons
    n
    (1+ n))

こうすれば、引数nの値に応じて異なる dotted pair を作ることができます。
こういう場合は setq だけではだめです。もし

(defun plus-one (n)
  '(n . (1+ n)))

とやってしまうと、何を引数に与えても (n 1+ n) つまり (n . (1+ n)) が返
されるようになってしまいます。

もし ("From:" . "Takahashi") のようにいつも決まった値を持つ dotted
pair を作るのだったら、わざわざ cons を使わずに setq だけで OK です。

-- 
TAKAHASHI Naoto
ntakahas@...
http://www.m17n.org/ntakahas/