[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [bep] learning lisp: if, and, cond
- To: bep@argv.org
- Subject: Re: [bep] learning lisp: if, and, cond
- From: Reiko TAKAHASHI <HFC03614@nifty.ne.jp> (高橋玲子)
- Date: Thu, 21 Jun 2001 20:31:13 +0900
- Delivered-To: mailing list bep@argv.org
- Mailing-List: contact bep-help@argv.org; run by ezmlm
r高橋です。
Reply TAKAHASHI Naoto <ntakahas@...>'s message:
} す。defun の直前の開き括弧の上にカーソルを置いて M-q とすると自動的に
} インデントされますが、それが Emacs のおすすめ indentation です。
うわっ、これ便利ですね! Emacsって賢い……。
自分で書いているときは、その都度インデントするとわかりやすいのですが、途
中でぐちゃぐちゃになってきたりもしそうなので、「おすすめ」があると安心で
す。
} marker っていうのはバッファ内の位置を示すためのものです。普通、バッファ
} 内の位置は整数で表します。たとえば (char-after 1) とすると、現在のバッ
} ファの先頭の文字が返され、(char-after 100) とすると先頭から100番目の文
} 字が返されます。
}
} まあ普通はこれでいいんですが、ここでたとえば50番目の文字を消したりする
} と、(char-after 100) は以前101番目だった文字を返すことになります。とこ
} ろが場合によっては、途中で挿入や削除があっても最初に100番目だった場所
} を常にトレースしたい場合があります。marker はそういう時に使います。
} marker を作ってそれにバッファ内の位置を束縛(代入)すると、間に挿入や削
} 除があっても marker の示す位置は自動的に調整されるようになります。
}
} わからなかったら、とりあえずは忘れていいと思います。(^_^)
あやっ、まためんどうなことを訊いてしまったんですね。わかりやすい解説を
ありがとうございます! そういう機能もあるんだ、ということがわかってよか
ったです。文章とか文字列(?)の操作には、すごく関心があります。
} > これも、「ずるい」tっぽい? もう絶対に t だとわかっているので、なんと
} > 条件式のところに、最初から t を入れてしまう、ということですよね。
}
} 単に言葉使いの問題かもしれませんが、「もう絶対に t だとわかっている」
} というと消極的な感じがします。むしろ、「プログラマである俺様がこれ以降
} は全部こうすることに決めたんだ」という主張だと考えた方がいいかもしれま
} せん。
あっ、そうですよね。でも、私なんかだと、ほんとうは間違っているのに「プ
ログラマである俺様が……」とか言ってしまいそうです。でもでも、返す値を「
明示的に」決めてしまってもいいんだ、ということはわかりました。
} > 「cond の条件の最後が t でなく」というのは、「nil だったら」という意味
} > ですか?
}
} 違います。たとえばこんな例を考えます。
}
} (defun season (n)
} (cond
} ((not (integerp n))
} (print "Argument must be an integer")
} nil)
} ((= n 1) 'spring)
} ((= n 2) 'summer)
} ((= n 3) 'autumn)
} ((= n 4) 'winter)))
}
} 最初の (not (integerp n)) は fact の場合同様、整数かどうかのチェックで
} す。それより後ろは、1〜4の引数を春夏秋冬に変換する部分です。ここで最後
} の条件が t になっていません。ですから引数として1〜4以外の整数を与える
} とマッチする条件が一つもないことになります。この場合 cond は nil を返
} しますから、season の値も nil になります。
}
} もし最後の行を
}
} (t 'winter)))
}
} に変えると、1〜3以外の引数は全部 winter になります。違いがおわかりでしょ
} うか。
わかりました! (cond ...)の条件には、「例外」といっても、「〜〜じゃな
かったら」という形だけではなくて、「〜〜だったら」という特別な場合(だか
らやっぱり例外)が入れられるんですね。あたりまえのことで、表面的にはわか
っていたはずなのですが、ちゃんと飲み込めていませんでした。
今回考えてしまったのは、
((= n 1) 'spring)
((= n 2) 'summer) ...
の部分でした。これは、「文字列」ではなくて、「シンボル」を返していますよ
ね。
こういうときは、文字列よりシンボルを使うのが普通なのでしょうか?
たしかに、文字列にするとダブルクオートが付いてしまってじゃまなのですが、
なんだかシンボルを文字列代わりに使っている感じで不思議です。
**-***-***-***-***-***-***-***-***-***-***-***-**
Reiko TAKAHASHI (高橋玲子)
E-mail: HFC03614@...
ICQ UIN: 85924121 (Twinkle)
**-***-***-***-***-***-***-***-***-***-***-***-**