[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [bep] learning lisp
- To: bep@argv.org
- Subject: Re: [bep] learning lisp
- From: Reiko TAKAHASHI <HFC03614@nifty.ne.jp> (高橋玲子)
- Date: Fri, 01 Jun 2001 09:00:19 +0900
- Delivered-To: mailing list bep@argv.org
- Mailing-List: contact bep-help@argv.org; run by ezmlm
高橋玲子です。
また長いです。
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)
**-***-***-***-***-***-***-***-***-***-***-***-**