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

Re: [bep] learning lisp: let



井上
2かき回す可能性ありですが。

Reiko TAKAHASHI <HFC03614@...> writes:

> } 文字列は文字の配列です。ここでいう配列 (array) っていうのは専門用語な
> } んですけど、わかりますか?
> 
>  わかりません。
> 例の本も見てみたのですが、やっぱりわかりませんでした。

文字列は文字をいくつかならべて、ちょうどいい大きさの箱に入れたと考えてく
ださい。
「?a」と書くと「a」という1文字を表すのに対して、
「"a"」ではaという1文字が入ったちょうどいい大きさの箱を表します。
「"ab」では?a ?b を順に入れた箱です。
このあいだ坂本さんの話題ででてきたconcatなどの関数では引数として文字列を
たくさん与えてつなげることができますが、文字を与えることはできません。
文字から文字列への変換は、たとえば
(char-to-string ?a)
とすると1文字が入った長さ1の文字列"a"になるのでこれを使います。
文字列に対して操作をする関数はたくさんあるのですが、実は私もその都度調べ
たり人のを見たりして使っているのでここでは説明しません。(^^;)

> (let (a) (setq a 123) (print a))
> と書いてC-jすると、
> 123
> 123
> と二回表示されます。
> (私のところでは、(setq ...)だけでも、返された値を表示してしまうみたいで
> す……。)

lisp-interaction-modeでC-jすると、評価した結果がバッファの挿入されます。
だから、123が2回でてくるのは、
1回目はprintという関数の副作用
2回目は式全体の結果
です。最後に評価されるprintという関数がプリントした値を返すからでしょう。
setqで値が表示されるのもそういうわけです。

>  それから、BEPの音声で使っていると、エラーになったとき、「カーン」といわ
> れるだけなのですが、どこかに、なぜエラーになっているのかが表示されていた
> りしますか?(それを簡単に知る方法はあるでしょうか?)

"Messages"バッファに一応エラーの表示が残ります。
後、*scratch*バッファで遊ぶ前に
(setq debug-on-error t)
を評価してからやるとエラーになったときに例のバックトレースバッファが開く
のでなんとなく分かるかも知れません。
# ただし、このときBEPを使っているとad-何とかというのによく出くわすかも知
# れません。これはBEP自身がしゃべるために使っているadvice機能によるもの
# なので、多少エラーメッセージが複雑になります。

>  あとのほうの、"inner"と"outer"のある式を入れると、C-jの結果は、
> "inner"
> 
> "outer"
> "outer"
> になります。
> 途中の空行は、どこから来たのでしょう?
> それと、なぜ"outer"だけが二度表示されるのでしょうか?

"outer"が2回になるのは先ほど説明した通りです。
空行は実は上の"innter"の前にもあるはずです。
printという関数の説明
C-h f print RET
で見ると、
output the printed representation of OBJECT, with newlines around it.
となっているので、printがそういうものなのでしょう。
OBJECTはprintに与える引数のことを指しています。

> } 上では setq を使っていますが、let の中で使う変数には初期値を与えること
> } ができます。初期値を与えるときは、変数名と初期値を括弧でくくって書きま
> } す。
> } 
> } (let ((a 1) (b 1)) (+ a b)) => 3
> 
>  なるほど! たぶん、わかりました。
> aには1、bには2といった組み合わせ(?)が、ちゃんとわかるように括弧でくくるん
> ですね。
> aやbに与えられる初期値は、数字でなくてもいいですか?(たとえば、変数を与
> えることはできますか?)

できます。ただし、上の例で
(let ((a 1 ) (b 1)) ...)
というところで、1は実は「評価」された上でaやbに代入されます。ここに変数
を入れるということは、その変数の評価結果が入るということになります。関数
だったときも同じです。
だから、
(setq x 10)
した上で
(let ((a x)) a)
とすると10が結果になります。
xをクオートした場合はxというシンボルになるので、
(let ((a 'x)) a)
の結果はxになります。

> あと、ここでは「初期値を与える」のであって、「束縛」とはまた違う……ので
> しょうか?

「初期値に束縛する」ということで同じです。
# バインドするとかにした方が納得が早そう

> 
> } 初期値を明示的に与えないと、nil が初期値になります。
> } 
> } (let (a) a) => nil
> 
>  これは、勝手に、aにnilという3文字が入る、ということですね(なにも指定
> しないのに、3文字も入るだなんて、なんだかずるい感じです(^_^;))。

3文字というか、nilというシンボル(普通は「偽(ギと読む)」を表します)が
入ります。nilは前にも話がでましたが何回評価してもnilというシンボル自分自
身です。

# 自分でチェックしながら書いていると時間がかかりますね。N高橋さんにおま
#   かせするべきなのかも。

-- 
                    Koichi Inoue, ARGV
                    E-Mail: inoue@...
                    ICQ UIN: 74900690