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

learning lisp: variables



Mitsugu SAKAMOTO writes:

> 一般に(lispは知りません)変数を宣言すると言うのはこれからAという変数をこ
> んなかたで(文字列とか整数とか少数など)使うのよ。って言うことをプログラム
> の最初の法で記述します。
> #一般にといいましたが、これはCですね。
> つまり宣言されていない変数がいきなり出てくることは、無いのです。

Cに限らず、近代的な言語は大抵そうです。
変数宣言しなくていい方が少数派でしょう。

> あ、でもlispって宣言するんですか?コード読んでると今まで無かった変数が突
> 然出てくるときがあるのですが。

Lisp では宣言しなくても使えます。なにもしていない状態で *scratch* バッ
ファに行き x と C-j を連続して打つと、おなじみの Symbol's value as
variable is void というエラーになります。ここで (setq x 123) C-j とや
ると、グローバル変数のxに123が代入されます。で、再び x C-j とすると、
今度は123という値が返ってきます。

最初から値が入っているグローバル変数もあります。emacs-version なんかが
そうです。

それから関数から別の関数を呼び出すと、外側の関数での変数宣言が内側の関
数にも引き継がれます。

(defun outer () (let ((a 4)) (inner)))
(defun inner () (let ((b 6)) (+ a b)))
(outer) => 10
a => エラー
b => エラー

この話は前にもちょっとしましたね。

Koichi INOUE writes:

> Emacs lispの場合「型」というのは代入するものによってころころ変わるはず
> なので、「こんな型で」という指定ではないと思います。

Emacs Lisp の場合、型の宣言はありませんね。Common Lisp なんかだと、型
を宣言してもよくて、宣言するとコンパイルした結果の効率がよくなったりし
ます。

> そして宣言は(setq ....) (defvar ...) それにletの最初の一時的な束縛指定
> の部分で指定するわけです。

setq の場合は宣言って言うかなあ。あんまり言わないような気がします。
defvar は宣言って言っていいと思います。計算機のためというよりも、ユー
ザやプログラマ自身のためのような感じですけど。

> あるいは、
> (make-local-variable ..)
> でバッファの中でローカルになるように宣言したりします。
> setq defvar で宣言した変数はEmacsの他の部分にも影響を与えるので、一時
> 的にしか使わない変数はletなどでくくって範囲を限定して宣言します。
> # 嘘書いてるかも知れません。

合ってると思います。

-- 
TAKAHASHI Naoto
ntakahas@...
http://www.m17n.org/ntakahas/