[SML 7873] Re: 連想計算というリフレクティブな手法

Narita Takaoki Narita.Takaoki @ exc.epson.co.jp
2010年 12月 14日 (火) 17:11:09 JST


成田です。

> sumim こと鷲見です。
> 
> 連想計算でもリフレクティブでもないので恐縮ですが、
> にぎやかしにと、2つほど考えてみました。

同様にぎやかしですが、それどころか Smalltalk にもなってません。

これを Smalltalk 的に書くとしたら?で詰まってしまった・・・
Common Lisp で書いてしまいましたが:

(defun sequential-square (comp-op operator n)
  (assert (integerp n) (n)) ;; 本質には関係しないので無視してください。
  (cond ((< n 1) nil)
        ((= n 1) operator)
        ((> n 1)
         (cond ((oddp n)
                (funcall comp-op
                 (sequential-square comp-op operator (1- n)) operator))
               ('t
                (let
                 ((sq-op (sequential-square comp-op operator (/ n 2))))
                 (funcall comp-op sq-op sq-op)))))))

(defun composition-op (func1 func2)
  (lambda (x) (funcall func1 (funcall func2 x))))

(defun fibo (x) (list (+ (car x) (cadr x)) (car x)))

(defun fibonacci (x)
  (cond ((< x 1) nil)
        ((= x 1) 1) ;; かなりインチキ
        ('t
         (car
          (funcall
           (sequential-square #'composition-op #'fibo (1- x)) '(1 0))))))

計算量は、O(log(n))なので、数値格納のメモリーさえ確保できれば20
万項目くらいまでなら我慢できる時間で計算可能ですが、計算できたか
らって何に使うんでしょうね・・・

ここまで一般化していないフィボナッチ数列特化のものでは、Smalltalk
でもブロックなど使って以前書いたことはありますが、今回の場合は、
高階関数構造をエレガントに Smalltalk らしくというところで思考が停止。

--
セイコーエプソン株式会社 機器ソフトウェア統括センター
機器ソフトウェア品質・生産技術部   成田 隆興


SML メーリングリストの案内