mokeheheのScheme日記

ツッコミ、添削大歓迎です。いろいろ教えてください。

2008-01-02

[] Practical Common Lisp第5章 関数

新しい関数の定義
関数パラメータリスト
オプションパラメータ
  • 関数引数リストに &optional をつける
  • デフォルト値を nil 以外にしたい場合は (param-name vaue) にする
  • 引数が与えられたかどうか知りたい場合は (param-name value supplied-p) とする
残りのパラメータ
キーワードパラメータ
(defun foo (&key ((:apple a)) ((:box b) 0) ((:charlie c) 0 c-supplied-p))
  (list a b c c-supplied-p))
上記のパラメータを混ぜて使うとき
関数戻り値
  • 関数の最後の式の値
  • return-from 特殊オペレータで
    • return-fromは関数に結び付けられるのではなく、block特殊オペレータから抜ける
    • defunは関数全体を同名のブロックで囲むため、関数から抜けることができる
  • return-from の最初の引数(ブロック名)はクォートの必要なし
  • 関数名を指定して return-from だと、関数名を変えたときに一緒に変えなきゃいけなくてメンドイ、けどreturn-fromを陽に使う機械はそんなに多くないので実際はたいして問題にならない
データとしての関数高階関数

xyzzy-lispでは loop が単なる無限ループなので、plotはdoを使って

(defun plot (fn min max step)
  (do ((i min (+ i step)))
      ((> i max))
    (dotimes (j (funcall fn i)) (format t "*"))
    (format t "~%")))
無名関数

[] Practical Common Lisp第4章 シンタックスとセマンティクス (2)

関数呼び出し
特殊オペレータ
  • 関数だと、呼び出される前に引数がすべて評価されてしまうので、ifなどが表現できない
マクロ

特殊オペレータとマクロって何が違うの?いっしょでよくない?

真、偽、そして等値性
  • eq: オブジェクト同値。実装依存なので、数値やキャラクタの比較に使うべきではない。
  • eql: 同じクラスのオブジェクトの2つの値が等しいか。同じクラスで値が等しい場合は真であることが保証される。別のクラスの場合等しくないことが保証される。
  • この本では常にeqlを使う
  • equal: リストや文字列の中身を見て比較してくれる。あとはeqlと一緒
  • equalp: 大文字小文字を同一とみなす。整数と浮動小数も。リストの要素同士がequalpの場合、真。あとはeqlと一緒
Lispコードの整形
  • 文法や意味的にではなく、コードの読み書きのためにインデント重要
  • 閉じ括弧は別の行に書くな
トラックバック - http://sicp.g.hatena.ne.jp/mokehehe/20080102