廣島です.
Scheme (または Lisp) での「ファーストクラスとしての関数」例です.
;;; 引数が正なら sin(x) を,そうでないなら sinh(x) を返す関数
(define (f x)
((if (positive? x) sin sinh) x))
(if (positive? x) sin sinh) を __強いて__ C 風に書けば
if (x > 0) { sin } else { sinh }
で,それを x に適用しているので,
(if (x > 0) { sin } else { sinh })(x);
みたいな感じです.
また,関数を引数として受け取り,関数を返す関数も定義できます.
例えば...
;;; 1 変数述語関数を受け取り,その否定述語関数を返す関数
;;; 例:(complement odd?) ==> even?
(define (complement p?)
(lambda (x) (not (p? x))))
;; 述語関数 positive? の否定述語関数を non-positive? と定義
(define non-positive? (complement positive?))
;; 実行例
(non-positive? -1) ; ==> #t
(non-positive? 0) ; ==> #t
(non-positive? 1) ; ==> #f
;;; 多変数の述語関数を受け取り,
;;; その否定述語関数を返す関数に拡張できる.「読者への課題」?
;;; 例:(complement <) ==> >=
通常のスクリプトに使うことは,多分無いのだろうけど,
こんなことも出来るというところに,何故か刺激を感じてしまうのでした.
-----------------------------
廣島 勉
(tsutomu@...)
PS. [TSabc:287] の「レンガパズルプログラム」の Scheme 版も書いてみました.
さすがに投稿するのはやめておきます.
他に Common Lisp 版と,入門のつもりで Python 版も書きました.
興味があれば私信で送ります.> 中村 のりつぐ さん