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

Masato Sumi sumi @ seagreen.ocn.ne.jp
2010年 12月 14日 (火) 20:04:40 JST


sumim です。

まだ流れを追いきれていないので、Smalltalk的に書き直せていませんが、
とりあえず成田さんのCLのコードをSmalltalkで動くよう直訳してみました。
Squeak4.1とVisualWorks7.7で動作します。


| sequentialSquare compositionOp fibo fibonacci |

sequentialSquare := nil.
sequentialSquare := [:compOp :operator :n |
   n < 1 ifTrue: [nil] ifFalse: [
   n = 1 ifTrue: [operator] ifFalse: [
   n > 1
      ifTrue: [
         n odd ifTrue: [
            compOp
               value: (sequentialSquare
                  value: compOp value: operator value: n - 1)
               value: operator]
      ifFalse: [
         | sqOp |
         sqOp := sequentialSquare
            value: compOp value: operator value: n / 2.
         compOp value: sqOp value: sqOp]]]]].

compositionOp := [:func1 :func2 |
   [:x | func1 value: (func2 value: x)]].

fibo := [:x | Array with: x first + (x at: 2) with: x first].

fibonacci := [:x |
   x < 1 ifTrue: [nil] ifFalse: [
   x = 1
      ifTrue: [1]
      ifFalse: [
         ((sequentialSquare
               value: compositionOp value: fibo value: x - 1)
            value: #(1 0)) first]]].

fibonacci value: 1000


2010年12月14日17:11 Narita Takaoki <Narita.Takaoki @ exc.epson.co.jp>:
> 成田です。
>
>> 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))))))


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