diff --git a/content/20240428122916 setf setq defvar defparameter の違い.md b/content/20240428122916 setf setq defvar defparameter の違い.md index 9615c74..e3a0ddc 100644 --- a/content/20240428122916 setf setq defvar defparameter の違い.md +++ b/content/20240428122916 setf setq defvar defparameter の違い.md @@ -4,9 +4,15 @@ そもそも・・・ defvar, defparameterはダイナミックスコープの変数(スペシャル変数)を定義する。 letや未定義時のsetfはレキシカルスコープの変数を定義する。 +グローバル変数をレキシカルに作る方法は(少なくとも標準的には)無い。 上記未定義時のsetfは期待した動作をするが、推奨されていない。 +[[20240428125606 ダイナミックスコープ レキシカルスコープ |ダイナミックスコープ レキシカルスコープ]] -- defvar: 値が定義されていなければ定義する。上書きしようとしても存在している場合はできない。 +cf. [lispguide.xml](https://google.github.io/styleguide/lispguide.xml?showone=Global_variables_and_constants#Global_variables_and_constants) +> Common Lisp does not have global lexical variables + +- defvar: 値が定義されていなければ定義する。上書きしようとしても存在している場合はできない(というか無視される)。 - defparameter: 定義されているかに関係なく定義する。すでに定義されていたら上書きする。 +- defconstant: 定数を定義する。複数回定義しようとしたり、値を変更しようとするとエラーになる。 - setf: 定義された変数を変更するために使う。定義されていない変数を変更しようとすると、新規作成され、警告が出る。 - setq: 使わなくてよい。 setfはsetqの上位互換。