Ads by Google
新しい記事を書く事で広告が消せます。
私は知識に何ものかを付け加え,また他の人々がより多くのものを付け加える手助けをした --- G.H.ハーディ
(fizzbuzz) ==> (generator *msgQ), // 生産者
(take 100 *msgQ *x), // 消費者
(fizzbuzz *x *fizzbuzz), // 加工者
(printList *fizzbuzz). // 表示者
// 1 から数を生産開始
(generator *msg)
==> {(= *msg (1 | *msg1))}, (generator 1 *msg1).
// 要求メッセージがきたら生産
(generator *n (need | *msg))
==> {(add *n 1 *n1), (= *msg (*n1 | *msg1))}, (generator *n1 *msg1).
// 停止メッセージがきたら生産終了
(generator *n (halt | ?)) ==>.
// 生産済みだったら取るだけ
(take *n (*m | *msg) *x)
==> {(= *x (*m | *x1)),(sub *n 1 *n1)}, (take *n1 *msg *x1).
// 取り終わったら終了メッセージを送る
(take 0 *msg *x),{(pvar *msg)}
==> {(= *msg (halt)), (= *x ())}.
// メッセージを送って生産してもらう
(take *n *msg *x), {(> *n 0), (pvar *msg), (= *msg (need | *msg1))}
==> (take *n *msg1 *x).
// できたそばから表示
(printList (*x | *xs))
==> {(format "/a " (*x))}, (printList *xs).
(printList ()) ==> {(format "/n" ())}.
// fizzbuzz filter
(fizzbuzz (*x | *xs) *fizzbuzz), {(:= 0 (mod *x 3)), (:= 0 (mod *x 5))}
==> {(= *fizzbuzz (FizzBuzz | *fizzbuzz1))}, (fizzbuzz *xs *fizzbuzz1).
(fizzbuzz (*x | *xs) *fizzbuzz), {(:= 0 (mod *x 3)), (not (:= 0 (mod *x 5)))}
==> {(= *fizzbuzz (Fizz | *fizzbuzz1))}, (fizzbuzz *xs *fizzbuzz1).
(fizzbuzz (*x | *xs) *fizzbuzz), {(not (:= 0 (mod *x 3))), (:= 0 (mod *x 5))}
==> {(= *fizzbuzz (Buzz | *fizzbuzz1))}, (fizzbuzz *xs *fizzbuzz1).
(fizzbuzz (*x | *xs) *fizzbuzz), {(not (:= 0 (mod *x 3))), (not (:= 0 (mod *x 5)))}
==> {(= *fizzbuzz (*x | *fizzbuzz1))}, (fizzbuzz *xs *fizzbuzz1).
(fizzbuzz () *fizzbuzz) ==> {(= *fizzbuzz ())}.
(fizzbuzz *n) ==> (gen 1 *x), (take *n), (filter *x *l), (printer *l).
(gen *i *x), (take *n)
==> {(> *n 0), (= *x (*i | *x1)), (add *i 1 *i1), (sub *n 1 *n1)},(gen *i1 *x1), (take *n1).
(gen *i *x), (take 0) ==> {(= *x ())}.
// 以下,同じ
(filter (*x | *xs) *filter), {(:= 0 (mod *x 3)), (:= 0 (mod *x 5))}
==> {(= *filter (filter | *filter1))}, (filter *xs *filter1).
(filter (*x | *xs) *filter), {(:= 0 (mod *x 3)), (not (:= 0 (mod *x 5)))}
==> {(= *filter (Fizz | *filter1))}, (filter *xs *filter1).
(filter (*x | *xs) *filter), {(not (:= 0 (mod *x 3))), (:= 0 (mod *x 5))}
==> {(= *filter (Buzz | *filter1))}, (filter *xs *filter1).
(filter (*x | *xs) *filter), {(not (:= 0 (mod *x 3))), (not (:= 0 (mod *x 5)))}
==> {(= *filter (*x | *filter1))}, (filter *xs *filter1).
(filter () *filter) ==> {(= *filter ())}.
(printer (*x | *xs))
==> {(format "/a " (*x))}, (printer *xs).
(printer ()) ==> {(format "/n" ())}.
[D]>include "C:\\Documents and Settings\\aloha.IIC\\デスクトップ\\fizzbuzz2.eti"
[D]>n
Execution mode "N"
[N]>dn
[N:N]>(fizzbuzz 4)
-------------------------N execution ---------------------
============================
(ans (fizzbuzz 4))<-(gen 1 *A), (take 4), (filter *A *B), (printer *B).
============================
(ans (fizzbuzz 4))<-(filter (1 | *A) *B), (printer *B), (gen 2 *A), (take 3).
============================
(ans (fizzbuzz 4))<-(printer (1 | *A)), (gen 2 *B), (take 3), (filter *B *A).
1 ============================
(ans (fizzbuzz 4))<-(gen 2 *A), (take 3), (filter *A *B), (printer *B).
============================
(ans (fizzbuzz 4))<-(filter (2 | *A) *B), (printer *B), (gen 3 *A), (take 2).
============================
(ans (fizzbuzz 4))<-(printer (2 | *A)), (gen 3 *B), (take 2), (filter *B *A).
2 ============================
(ans (fizzbuzz 4))<-(gen 3 *A), (take 2), (filter *A *B), (printer *B).
============================
(ans (fizzbuzz 4))<-(filter (3 | *A) *B), (printer *B), (gen 4 *A), (take 1).
============================
(ans (fizzbuzz 4))<-(printer (Fizz | *A)), (gen 4 *B), (take 1), (filter *B *A).
Fizz ============================
(ans (fizzbuzz 4))<-(gen 4 *A), (take 1), (filter *A *B), (printer *B).
============================
(ans (fizzbuzz 4))<-(filter (4 | *A) *B), (printer *B), (gen 5 *A), (take 0).
============================
(ans (fizzbuzz 4))<-(printer (4 | *A)), (gen 5 *B), (take 0), (filter *B *A).
4 ============================
(ans (fizzbuzz 4))<-(gen 5 *A), (take 0), (filter *A *B), (printer *B).
============================
----------------------------------------------------------
execution time: 31 [msec]
wiliki?leque Editing with Emacs
ときどき UTF-8 なテキストを編集しなくてはいけないことがあって nvi だといろいろ不便なのでこれを機に Emacs に乗り換えた(vim も候補にあがったけれど、vim script があまり好きになれそうにないのと、:set lisp しても ( や ) が S式単位でうごいてくれなかったので×)。
let double = λ f:X -> X . λ a . f(f(a)) in
let a = double succ 1 in
let b = double not true in
...
(test) --> (= *F (*X -> *X)), // f:X -> X のつもり.下の式にインラインで書いても良いけど
(= *double (lambda (*F *A) (*F (*F *A)))),
(= *a (*double succ 1)),
(= *b (*double not true)),
(typeInf *a),
(typeInf *b).
(typeInf1 () ()) -->.
(typeInf1 (*F | *rest) (succ | *rest1))
-->
(= *F (Num -> Num)),
(typeInf1 *rest *rest1).
(typeInf1 (*F | *rest) (not | *rest1))
-->
(= *F (Bool -> Bool)),
(typeInf1 *rest *rest1).
(typeInf1 (*A | *rest) (true | *rest1))
-->
(= *A Bool),
(typeInf1 *rest *rest1).
(typeInf1 (*A | *rest) (*n | *rest1)),
{(number *n)}
-->
(= *A Num),
(typeInf1 *rest *rest1).
(typeInf2 ((Num -> Num) *X) *R)
-->
(typeInf2 *X Num),
(= *R Num).
(typeInf2 ((Bool -> Bool) *X) *R)
-->
(typeInf2 *X Bool),
(= *R Bool).
(typeInf2 Bool *R)
-->
(= *R Bool).
(typeInf2 Num *R)
-->
(= *R Num).
// 間違い !!
(typeInf ((lambda *parm *body) | *args))
-->
(typeInf1 *parm *args),
(print (lambda *parm *body)).
(typeInf ((lambda *parm *body) | *args))
-->
// コピーしてフレッシュな変数を使う
(copy (*parm *body) (*parm1 *body1)),
(typeInf1 *parm1 *args),
(print (lambda *parm1 *body1)),
(typeInf2 *body1 *result),
(print (*parm1 => *result)).
[D]>load "C:\\Documents and Settings\\aloha\\デスクトップ\\typeInf.eti"
[D]>(test)
-------------------------D execution ---------------------
(lambda ((Num -> Num) Num) ((Num -> Num) ((Num -> Num) Num)))
(((Num -> Num) Num) => Num)
(lambda ((Bool -> Bool) Bool) ((Bool -> Bool) ((Bool -> Bool) Bool)))
(((Bool -> Bool) Bool) => Bool)
----------------------------------------------------------
succeeded.
(test)
[D]>(compile (lambda (*x *y *z) (set! *a (+ *z (+ *x *y)))))
-------------------------D execution ---------------------
/* 変換過程
(lambda (*A *B *C) (set! *D (+ *C (+ *A *B))))
=>
(lambda (*A *B *C) (set! *E (+ *A *B)) (set! *F (+ *C *E)) (set! *D *F) *D)
=>
(lambda ("v0" "v1" "v2") (set! "v3" (+ "v0" "v1")) (set! "v4" (+ "v2" "v3")) (set! "v5" "v4") "v5")
*/
#include <stdio.h>
#include <jit/jit.h>
int main(int argc, char **argv) {
jit_context_t context = jit_context_create();
jit_type_t params[3];
jit_type_t signature;
jit_function_t function;
jit_value_t v0, v1, v2, v3, v4, v5;
jit_int arg0, arg1, arg2;
void *args[3];
jit_int result;
jit_context_build_start(context);
params[0] = jit_type_int;
params[1] = jit_type_int;
params[2] = jit_type_int;
signature = jit_type_create_signature(jit_abi_cdecl, jit_type_int, params, 3, 1);
signature = jit_type_create_signature(jit_abi_cdecl, jit_type_int, params, 3, 1);
function = jit_function_create(context, signature);
v3 = jit_insn_add(function, v0, v1);
v4 = jit_insn_add(function, v2, v3);
jit_insn_store(function, v5, v4);
jit_insn_return(function, v5);
jit_function_compile(function);
jit_context_build_end(context);
arg0 = 2;
args[0] = &arg0;
arg1 = 3;
args[1] = &arg1;
arg2 = 4;
args[2] = &arg2;
jit_function_apply(function, args, &result);
puts("/* (lambda (*A *B *C) (set! *D (+ *C (+ *A *B)))) */");
printf("(lambda (1 2 3)) => %d\n", (int)result);
jit_context_destroy(context);
return 0;
}
----------------------------------------------------------
succeeded.