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

learning lisp



n高橋です。

Reiko TAKAHASHI  (高橋玲子)writes:

>  n高橋さんが書いてくださった解説と↑で、すごくよくわかりました(のつもり
> です)。「式」というより、functionって考えるといいんですよね??(違うか
> な。実は、functionってなに?って逆に訊かれちゃったら私は答えられそうにな
> いので)。

はい、まさに function, 関数です。プログラミング言語は、手続き型とか関
数型とか宣言型とかいろいろ分類できるんですが、Lisp は関数型言語の代表
選手です。数学で言うところの関数と同じように、一つの関数を実行すると一
つの値を返すというのが大原則です。

> } ただし、見かけると思いますが(progn ...) とか(save-excursion ...) とか
> } (lambda () ...)とかの中身では、この「結果」は一番右にあったものだけが
> } 外に影響します。

>  ううん、わかりません……。
> (save-excursion ...)の「結果」って、「その直前(?)の位置へカーソルを戻す」
> ですよね??

「カーソルを戻す」というのは関数の実行に伴って生じる副作用です。副作用
と言っても別に悪い意味はありません。(save-excursion ...) の結果は、あ
くまでもこの関数を実行したときに返される値(あたい)です。値というのは数
のこともあれば、文字列のことも、リストのこともあります。

さて、井上さんの説明にあった通り、save-excursion は最後の関数の値を自
分自身の値として返します。ですからたとえば、

(setq x (save-excursion (f1 ...) (f2 ...) (f3 ...)))

となっていた場合、x には (f3 ...) を実行したときに返される値がセットさ
れます。

# だんだん「実行」とか「関数」とか「セット」とかじゃなくて Lisp 本来の
# 用語が使いたくてうずうずしてきましたが、そうしてしまうとかえって混乱
# させてしまいそうなので我慢します。

> 「一番右にあったものだけが外に影響する」って、どういう意味ですか?

上に書いたように、save-excursion の中で最後に実行した関数の値が、その
まま save-excursion 自身の値として返されるということです。

>  つまり、ユーザがキーボードから入れられるようになっているものが「コマン
> ド」で、プログラムの中で勝手にいろいろ動く(?)のが「関数」ということですね
> ??

はい、大体そんなもんです。一応確認しますと、コマンドも関数の一種です。
Lisp ではすべての命令は関数であり、その中でユーザがキーボードを使って
直接呼び出すものを特にコマンドと呼ぶわけです。

> } (format "猫%s 犬%s 亀%s" "1" "2" "3")
> } という関数の結果は"猫1 犬2 亀3"になります。これで何となく分かるでしょうか。

>  はい、なんとなくわかりました。それぞれの「穴」に独自の「名前」があるの
> ではなくて、「順番」に処理(?)されるんですね。

その通りです。

> } 1. (insert -- よしよし、挿入命令だな。次に来るものを挿入してやろう。

>  これ、ほんとうにものすごくわかりやすかったです!

お誉めいただいてありがとうございます。ただ注意していただきたいのは、私
の一連の説明は直感的なわかりやすさを優先するために用語その他の点で厳密
性を欠いています。どのくらい欠いているかと言うと、日本人に英語を教える
際にカタカナだけを使って教えるのと同じくらいの感じです。本当に英語が使
えるようになるためにはカタカナだけではだめなのと同じように、自分で 
Lisp が書けるようになるためには、ちゃんと Lisp 流の用語や概念が必要と
なります。ですから info その他を活用するようにして下さい。

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