[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
learning lisp: variables
- To: bep@argv.org
- Subject: learning lisp: variables
- From: TAKAHASHI Naoto <ntakahas@m17n.org>
- Date: Fri, 1 Jun 2001 15:26:11 +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)
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/