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

Masashi Umezawa ume @ softumeya.com
2010年 12月 14日 (火) 22:34:29 JST


こんにちは
梅澤です。

いやあ、盛り上がっていますねー。奇しくも今年最後のSmalltalk勉強会は
Smalltalk Superpowersで締めくくろうと思っています。(いつもの案内メール
別途書きます)
http://atnd.org/events/11043

皆さんのちょっとやり過ぎ間のある高等テクニック、ぜひ紹介させていただきたく
思います。

ではでは。

2010年12月14日20:04 Masato Sumi <sumi @ seagreen.ocn.ne.jp>:
> 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))))))
>

-- 
"SoftUmeYa, LLC"
[:masashi | ^umezawa]


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