目次
関数と変数の作成
defun
関数定義
全ての引数は評価されない(マクロで通常の関数ではない).
setf
変数への代入
変数宣言なしで新たに変数が作れる.トップレベルで使えばスペシャル変数(大域変数),関数内で使えばレキシカル変数(ローカル変数)を作れる.第1引数は評価されない(マクロで通常の関数ではない).
共通点
- どちらも副作用がある.つまり処理をして値を返すだけでない.
defun
は関数を実行できるよう定義する副作用を持つ.
setf
は代入により第1引数の変数の値を変える副作用を持つ.
- 引数を全て評価しないので関数ではない.
スペシャル変数とは?
- グローバルスコープを持つ.つまり大域変数としてどこからでもアクセスできる.
- 他のプログラミング言語の大域変数との違いは,ローカルスコープ(Lispではレキシカルスコープと呼ばれる)の変数がスコープを隠すことができるという点.
- Cではグローバル変数と同じ名前の変数をローカル変数として使用するとすると既に定義済みとエラーが出るが,LispではOK.
- スペシャル変数は実行時に変数が呼ばれた時点で,その変数がどの値と束縛されているか定義をたどっていく.もし,ローカルスコープで上書きされていればその値が返るし,上書きされてなければグローバル変数の定義が返る.この様に実行時でスコープがダイナミックに変化するので,スペシャル変数はダイナミックスコープを持つとも言われる.
- 一方,レキシカルスコープの変数は実行時で値が決まるのではなく,変数が定義された時に束縛された値に静的に決まる.
- スペシャル変数は他に,
defparameter
,defvar
,setq
でも作成できる.ただしsetq
はsetf
同様,トップレベルで使用した場合にスペシャル変数を作る.
用語
- 束縛(binding) — 新しく変数を作って値を与えること(p.19).
- 代入 — 既に存在している変数の現在の値を変更すること(p.19).
- フォーム — 評価の対象となるもの.一般のプログラミング言語の「式」に相当(p.15, 32).
参考リンク
第1話,2話の新規組込み関数とシンボル
lisp-implementation-type
—Lisp処理系の名前を返す.
pi
—円周率の近似値を表す変数.
sin
—正弦関数.例,(sin pi) => 0
.
expt
—冪乗関数(exponential).例,\(2^3\)は(expt 2 3) => 8
sqrt
—平方根を求める.
#C(2 3)
—複素数\(2+3i\)を表す複素数オブジェクト.
setf
—代入し代入した値(第2引数の値)を返す.
abs
—絶対値を返す.引数は1つまで.