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

Re: [bep] learning lisp: let



 高橋玲子です。

 learning lispが増殖(?)していてびっくりしました。
n高橋さん、整理してくださって、丁寧に解説してくださってありがとうございま
す。
だんだん難しくなってきたので、ちゃんとついていけるか心配です……。

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

} ぶぶー。残念。
} 文字と文字列は違うものなんです。?a は文字で、"a" は文字列です。
} 文字列は文字の配列です。ここでいう配列 (array) っていうのは専門用語な
} んですけど、わかりますか?

 わかりません。
例の本も見てみたのですが、やっぱりわかりませんでした。

} (let (a) なんとか) というのは、「この a はこの let の中だけで有効です」
} ということになります。
} 
} (let (a) (setq a 123) (print a))
} (print a)
} 
} とやると、最初の print はちゃんと 123 をプリントしますが、次の print 
} はエラーになります。let を抜けた時点で new-varialbe が「なかったこと」
} になっちゃうからです。また、
} 
} (let (a)
}   (setq a "outer")
}   (let (a) (setq a "inner") (print a))
}   (print a))
} 
} とやると、まず "inner" がプリントされ、それから "outer" がプリントされ
} ます。

 これは、たぶんわかりました。
*scratch* バッファでもやってみました。
(let (a) (setq a 123) (print a))
と書いてC-jすると、
123
123
と二回表示されます。
(私のところでは、(setq ...)だけでも、返された値を表示してしまうみたいで
す……。)

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

 あとのほうの、"inner"と"outer"のある式を入れると、C-jの結果は、
"inner"

"outer"
"outer"
になります。
途中の空行は、どこから来たのでしょう?
それと、なぜ"outer"だけが二度表示されるのでしょうか?

} > (let (a) (setq a 20))の結果(副作用)は、
} > (let (a 20))と一緒ですか?
} 
} おしい。かっこが一組足りません。(let (a 20)) はエラーになります。
} 正しくは (let ((a 20))) です。これはよくやってしまう間違いです。

 きゃあっ! もう思わず歌ってしまいそうです(^_^)。

} let のすぐうしろには、その let の中だけで使う変数のリストを書きます。
} 
} (let (a b) (setq a 1) (setq b 2) (+ a b)) => 3
} 
} 上では setq を使っていますが、let の中で使う変数には初期値を与えること
} ができます。初期値を与えるときは、変数名と初期値を括弧でくくって書きま
} す。
} 
} (let ((a 1) (b 1)) (+ a b)) => 3

 なるほど! たぶん、わかりました。
aには1、bには2といった組み合わせ(?)が、ちゃんとわかるように括弧でくくるん
ですね。
aやbに与えられる初期値は、数字でなくてもいいですか?(たとえば、変数を与
えることはできますか?)
あと、ここでは「初期値を与える」のであって、「束縛」とはまた違う……ので
しょうか?

} 初期値を明示的に与えないと、nil が初期値になります。
} 
} (let (a) a) => nil

 これは、勝手に、aにnilという3文字が入る、ということですね(なにも指定
しないのに、3文字も入るだなんて、なんだかずるい感じです(^_^;))。

} ですから、(let (a 20)) と書くと a と 20 という変数を宣言していることに
} なります。ところが20は変数名として不適当ですから、エラーになります。

 なるほど、そうですね。
意味がわかってみると、少し「静か」になった気がします。


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