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

learning lisp: defun



今度は defun です。

> } プログラムとして用いられているリストの中ならば、最初の要素が関数でそれ
> } 以外が変数です。使われ方によって同一のシンボルが変数にも関数にもなりま
> } す。例を出しましょう。
> } 
> } (defun (x) (* x 2))
> } (setq x 3)
> } 
> } とすると、
> } 
> } x → 3
> } (x 1) → 2
> } (x 2) → 4
> } (x 3) → 6
> } (x x) → 6
> } 
> } となります。最後の (x x) はわかりますか?

>  また例の本からの拾い読みなのですが、defunは、関数(コマンドとか?)を作
> りたいときに使うものですよね……??

あ、済みません。この部分は坂本さんへのリプライだったので、説明抜きで
defun を使ってしまいました。

> 本に書かれていた例は、ぜーんぶdefunの後に「関数名」みたいなものが書かれて
> いました(my-modeとか、hello-worldとか)。

1文字のxだって立派な関数名です。+ とか - も関数名です。-=+*+=- なんて
関数だって作れます。わかりにくいからやめた方がいいと思いますけど。

>  (defun (x) (* x 2))
> と書いた場合、
> (x)が「引数リスト」、
> (* x 2)が「定義本体」
> と考えていいですか?

そのとおりです。

> (setq x 3)

>  xそのものに3を束縛する。

正解。

> x → 3

>  3が束縛されているので、xを評価した結果は3。

正解。

> (x 1) → 2

>  (* x 2)のほうのxに1を入れているのかな……と思うのですが、3はどこへ行っ
> たんでしょう……?

xに限らず、任意のシンボルは変数としての値と関数としての定義を両方同時
に持つことができます。

> ここでのxは、「最初のx」なので、単なる「関数」((* x 2))だということです
> か?

そうです。

> でもでも、そうしたら、最初の
> x → 3
> はどうして3なのでしょう?

関数ではなくて変数として評価されているからです。
xの周りに括弧がついていない点に注意して下さい。

> (x 2) → 4
> (x 3) → 6

>  それぞれ、(* x 2)のxに、2と3を入れている……んですよね???

正解。

> } (x x) → 6

>  書いてくださったように「最初の要素が関数でそれ以外が変数」と考えると、

> 最初のxは、(* x 2)という関数、
> 次のxは、3が束縛されたx、
> ということになるでしょうか?

大正解。

>  解説ありがとうございます。
> 「束縛」と聞いて、"bind"よりもずうっと厳めしい雰囲気を想像していました(
> ほんとうは"bind"も厳めしいのかもしれませんが)。
> 最近、キーボードの配列を返るソフトの説明を読んでいて、「キーバインド」と
> いう用語(?)をたくさん見ました。
> 「関係づける」というか、あるキーにある役割(文字とか)を「結びつける」み
> たいな雰囲気かなと思っていました……。

そんなところだと思います。誰がどうして evaluate を「評価する」と訳した
のかは知りません。中西先生あたりでしょうか。

>  「某アニメ」は、大・大ファンな友だちがいるのですが、私は全然知りません。

> 1、2年前、真夜中にも放送されていましたよね……?
> もしや、このmlでも話題になったことがあるのでしょうか(信じられない!(^_^)
> )

放送されていたのが丁度外国にいた時期なので、私はアニメ自体は一度も見た
ことがありません。にもかかわらずファンが作った Web ページはずいぶん見
て回ったので、登場人物やストーリーは知っていたりします。

あれに関しては守岡さんが詳しいはずです。あれ関係のページを作って Yahoo 
のクールサイトに認定されたくらいあれですから。

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