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

learning lisp: indentation, cond



n高橋です。

Reiko TAKAHASHI  (高橋玲子)writes:

> } す。defun の直前の開き括弧の上にカーソルを置いて M-q とすると自動的に
> } インデントされますが、それが Emacs のおすすめ indentation です。

後で訂正を出しましたが、M-q じゃなくて C-M-q でした。コントロールとメ
タとQを同時に押します。あるいはエスケープを打ってからC-q です。

>  うわっ、これ便利ですね! Emacsって賢い……。
> 自分で書いているときは、その都度インデントするとわかりやすいのですが、途
> 中でぐちゃぐちゃになってきたりもしそうなので、「おすすめ」があると安心で
> す。

単に Tab を1回打つと、その1行が「おすすめ」の位置に調整されます。また
バッファが Emacs-Lisp mode のときに C-j とすると、改行してから tab を
打ったのと同じ効果があります。~/.emacs や xxx.el というファイルを編集
しているときは自動的に Emacs-Lisp mode になります。

一方、*scratch* バッファは Emacs-Lisp mode ではなくて、Lisp
Interaction mode です。この場合 C-j は直前のS式を評価してその結果をバッ
ファ内に挿入します。ちょっとややこしいのですが、Emacs-Lisp mode は 
Lisp のプログラムを作成するモードで、Lisp Interaction mode はその名の
通り Emacs と Lisp で対話するモードだと思って下さい。

一時的な関数を *scratch* 内で直接作成することもよくありますし、それは
全然悪いことじゃありません。ただその場合、「改行 + tab」のつもりで C-j 
とやってしまって意図せずにS式を評価させてしまうというミスが発生しやす
いので、そうなってもあわてないようにして下さい。

>  わかりました! (cond ...)の条件には、「例外」といっても、「〜〜じゃな
> かったら」という形だけではなくて、「〜〜だったら」という特別な場合(だか
> らやっぱり例外)が入れられるんですね。あたりまえのことで、表面的にはわか
> っていたはずなのですが、ちゃんと飲み込めていませんでした。

cond の「条件」は本来「〜だったら」の意味です。ただ、現実にプログラム
を書いていると、まず例外的事象を取り出してしまった方が都合のよい場合が
多いというだけのことです。

>  今回考えてしまったのは、
>    ((= n 1) 'spring)
>    ((= n 2) 'summer) ...
> の部分でした。これは、「文字列」ではなくて、「シンボル」を返していますよ
> ね。
> こういうときは、文字列よりシンボルを使うのが普通なのでしょうか?

この関数の評価結果を見るのは人間ですので、今のところはシンボルでも文字
列でも好みの方でかまいません。もし他の関数がこの season を呼び出してそ
の評価結果を利用するようなことがあるならば、その呼び出す方の関数に合わ
せる必要が出てきます。

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