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

Re: [bep] learning lisp



 高橋玲子です。
また長いです。

Reply Koichi INOUE <inoue@...>'s message:

} 変数には数値、文字、文字列、'yなどの別のシンボルを入れることができます。
} 数値は1, 3.14など
} 文字は ?a ?bなどとあらわされます。
} 文字列は"a", "abc", "3.14", "GNU Emacs"などの「文字の列」
} 変数にはほかの値を束縛(bind)することができますが、数値や文字列は定数と言
} われるものでそれになにかをbindすることはできません。

 「文字」にしたいときは、"a" "b"と書くこともできるし、?a ?bと書くことも
できるんですね?

} >  なぜ、(let (a) (setq a 20))の最初のaが括弧でくくられているのでしょう?
} 
} (let 一時的な束縛指定 やりたいこと
} という決まりになっていて、
} 一時的な束縛指定は
} (a) → aという変数をletの中だけで周りに影響を与えずに(ローカルに)宣言する。

 変数を「宣言する」というのは、どういう意味ですか?
aという変数があって、それを評価するとaになる、ということをプログラムに教
えている……???
変数も、関数みたいに「評価」できるんでしょうか……。

} ((a 10) (b 20)) →letの中だけでaを10に、、bを20に束縛する。
} ((a (point))) →letの中だけでaを(point)の結果、つまり現在のカーソル位置
} に束縛する。

(let (a) (setq a 20))の結果(副作用)は、
(let (a 20))と一緒ですか?
この場合、setqと同じように、aは評価されない……?
それから、このS式が返す値は20ですか?

} # r高橋さんにそのうち教わることになりそう

 絶対になりません!


Reply TAKAHASHI Naoto <ntakahas@...>'s message:

} > (setq x 'y) → y
} 
} >  変数xそのものに、yという変数と同じ意味を持たせる。
} > なので、全体の評価結果はy(という変数)。
} 
} う〜ん、ちょっと違います。シンボルxの値としてシンボルyを束縛するという
} ことです。結果として、シンボルxを評価するとシンボルyが得られることにな
} ります。シンボルには数値や文字列だけでなく、シンボルを束縛することもで
} きます。

 そうだったんですね! わかりました。
「シンボルに、シンボルが束縛できる」ということが飲み込めていなくて、yは数
字とかじゃないし、どう言ったらいいのかな、と悩んだあげく、「同じ意味を持
たせる」とか「見なされる」とか書いていました。

} もしxとyが同じ意味だとしたら、xを評価した結果も10にならなくてはいけま
} せん。

 これは、2行目で、(set x 10)とした瞬間に、そうならなければならない、と
いうことですよね?

} # ちなみに別のシンボルだけでなく、自分自身を入れることもできます。
} # (setq x 'x)
} # x → x
} # x → x
} # …
} # きりがない。これはこれは使うことがあります。

 ……どう使えるのか、想像がつきません……。

} > x → y
} 
} >  1行目でxをyと見なして(?)いるので、xの評価結果はy。
} 
} 見なすのではなくて、xを評価した結果が別のシンボルyになっているのです。
} 
} > y → 10
} 
} >  2行目で、yと見なされた(評価された)xに10を束縛しているので、yの評価結
} > 果は10。
} 
} 2行目というのは (set x 10) ですね。
} 関数 set は、第1引数を評価した結果として得られるシンボルに、
} 第2引数を評価して得られるS式を束縛します。
} 第1引数はxで、これを評価するとシンボルyになります。
} また第2引数は10で、これを評価した結果は10そのものです。
} ですからシンボルyに10を束縛することになります。

 よくわかりました(のつもりです……)。

} > } ここで問題です。2行目の a は let の内側だけで有効なのに、なぜ2行目全体
} > } を評価した結果が 20 になるのでしょうか。
} 
} >  ……2行目の中でいちばん右の関数に当たる
} > (setq a 20)
} > から返される値が20なので、(let ...)は、その値を、全体の評価結果としてその
} > まま返しているのかな……と思ったのですが……???
} 
} すごい。それが正解です。

 ……私にとっては、まだ(let ...)の意味のほうが新しいので、単純に、「いち
ばん右側の関数から返ってくる値を……」と考えてしまうのが自然だったんです
(なので、全然すごくない……(^^;))。
ただ、ある時点で、ある変数にどんな値が入っているか、ということと、S式から
返される値とは、必ずしも一緒ではないというか、関係ない場合もあるのかな…
…ということはわかってきたと思います(墓穴かも……?)。

} プログラムとして用いられているリストの中ならば、最初の要素が関数でそれ
} 以外が変数です。使われ方によって同一のシンボルが変数にも関数にもなりま
} す。例を出しましょう。
} 
} (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の後に「関数名」みたいなものが書かれて
いました(my-modeとか、hello-worldとか)。

(本からの引用)
} すでに見慣れているかもしれませんが,関数の定義はdefunを用いて,
} (defun   関数名   (引数リスト)
}     "説明文章"
}     定義本体)
} という形式で行ないます。“引数リスト”の部分には,任意個の仮引数を列挙
} できます。 ...

 (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 2))だということです
か?
でもでも、そうしたら、最初の
x → 3
はどうして3なのでしょう?

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

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

} (x x) → 6

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

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

 ……なんか、背伸びしてむちゃくちゃ書いているかも……すみません。

} 最後に用語ですが、「束縛する」は英語で to bind です。当然ながら「束縛
} された」は be bound です。「評価する」は to evaluate です。eval という
} 関数もあります。日本語の「威張る」に引っかけて
} 
} (ここで詳細読みをオン)
} 
} 「エバる」
} 
} (詳細読みオフ)
} 
} ということもよくあります。以前話題になった某アニメとは関係ありません。

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

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

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


**-***-***-***-***-***-***-***-***-***-***-***-**
           Reiko TAKAHASHI  (高橋玲子)
         E-mail:  HFC03614@...
         ICQ UIN: 85924121  (Twinkle)
**-***-***-***-***-***-***-***-***-***-***-***-**