[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [bep] learning lisp: let
- To: bep@argv.org
- Subject: Re: [bep] learning lisp: let
- From: Koichi INOUE <inoue@argv.org>
- Date: 02 Jun 2001 22:37:38 +0900
- Delivered-To: mailing list bep@argv.org
- Mailing-List: contact bep-help@argv.org; run by ezmlm
- Organization: Accessibility Research Group for the Visually Impaired(ARGV)
- User-Agent: T-gnus/6.15.4 (based on Oort Gnus v0.04) (revision 01) SEMI/1.14.3 (Ushinoya) FLIM/1.14.2 (Yagi-Nishiguchi) APEL/10.3 Emacs/21.0.103 (i386-windy-freebsd4.3) MULE/5.0 (SAKAKI)
井上
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