作者: Tsutomu Hiroshima
日時: 2003/4/17(16:04)
廣島です.

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 版も書きました.
興味があれば私信で送ります.> 中村 のりつぐ さん