[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
learning lisp: let
- To: bep@argv.org
- Subject: learning lisp: let
- From: TAKAHASHI Naoto <ntakahas@m17n.org>
- Date: Fri, 1 Jun 2001 14:07:16 +0900 (JST)
- Delivered-To: mailing list bep@argv.org
- Mailing-List: contact bep-help@argv.org; run by ezmlm
- User-Agent: SEMI/1.14.3 (Ushinoya) FLIM/1.14.2 (Yagi-Nishiguchi) APEL/10.2 Emacs/21.0.104 (sparc-sun-solaris2.8) MULE/5.0 (SAKAKI)
n高橋です。このスレッドも思ったより長く続いてますね。
Reiko TAKAHASHI (高橋玲子)writes:
> 「文字」にしたいときは、"a" "b"と書くこともできるし、?a ?bと書くことも
> できるんですね?
ぶぶー。残念。
文字と文字列は違うものなんです。?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" がプリントされ
ます。
> 変数も、関数みたいに「評価」できるんでしょうか……。
もちろん。変数の価を得るってことは、その変数を評価するってことです。
> } ((a 10) (b 20)) →letの中だけでaを10に、、bを20に束縛する。
> } ((a (point))) →letの中だけでaを(point)の結果、つまり現在のカーソル位置
> } に束縛する。
> (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
初期値を明示的に与えないと、nil が初期値になります。
(let (a) a) => nil
ですから、(let (a 20)) と書くと a と 20 という変数を宣言していることに
なります。ところが20は変数名として不適当ですから、エラーになります。
--
TAKAHASHI Naoto
ntakahas@...
http://www.m17n.org/ntakahas/