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

learning lisp: let



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/