「対話によるCommon Lisp入門」第2話まとめノート

関数と変数の作成

  • defun 関数定義
    全ての引数は評価されない(マクロで通常の関数ではない).
  • setf 変数への代入
    変数宣言なしで新たに変数が作れる.トップレベルで使えばスペシャル変数(大域変数),関数内で使えばレキシカル変数(ローカル変数)を作れる.第1引数は評価されない(マクロで通常の関数ではない).

共通点

  • どちらも副作用がある.つまり処理をして値を返すだけでない.
    • defunは関数を実行できるよう定義する副作用を持つ.
    • setfは代入により第1引数の変数の値を変える副作用を持つ.
  • 引数を全て評価しないので関数ではない.

スペシャル変数とは?

  • グローバルスコープを持つ.つまり大域変数としてどこからでもアクセスできる.
  • 他のプログラミング言語の大域変数との違いは,ローカルスコープ(Lispではレキシカルスコープと呼ばれる)の変数がスコープを隠すことができるという点.
    • Cではグローバル変数と同じ名前の変数をローカル変数として使用するとすると既に定義済みとエラーが出るが,LispではOK.
    • スペシャル変数は実行時に変数が呼ばれた時点で,その変数がどの値と束縛されているか定義をたどっていく.もし,ローカルスコープで上書きされていればその値が返るし,上書きされてなければグローバル変数の定義が返る.この様に実行時でスコープがダイナミックに変化するので,スペシャル変数はダイナミックスコープを持つとも言われる.
    • 一方,レキシカルスコープの変数は実行時で値が決まるのではなく,変数が定義された時に束縛された値に静的に決まる.
    • スペシャル変数は他に,defparameterdefvarsetqでも作成できる.ただしsetqsetf同様,トップレベルで使用した場合にスペシャル変数を作る.

用語

  • 束縛(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つまで.