[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [bep] learning lisp: cons
- To: bep@argv.org
- Subject: Re: [bep] learning lisp: cons
- From: TAKAHASHI Naoto <ntakahas@m17n.org>
- Date: Tue, 17 Jul 2001 19:17:37 +0900 (JST)
- Delivered-To: mailing list bep@argv.org
- Mailing-List: contact bep-help@argv.org; run by ezmlm
- User-Agent: SEMI/1.14.3 (Ushinoya) FLIM/1.14.2 (Yagi-Nishiguchi) APEL/10.2 Emacs/21.0.105 (sparc-sun-solaris2.8) MULE/5.0 (SAKAKI)
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/