[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: Reiko TAKAHASHI <HFC03614@nifty.ne.jp> (高橋玲子)
- Date: Sat, 02 Jun 2001 21:25:08 +0900
- Delivered-To: mailing list bep@argv.org
- Mailing-List: contact bep-help@argv.org; run by ezmlm
高橋玲子です。
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)
**-***-***-***-***-***-***-***-***-***-***-***-**