目次
関数と変数の作成
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つまで.