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 "~%")))
無名関数
トラックバック - http://sicp.g.hatena.ne.jp/mokehehe/20080102