Loading [MathJax]/extensions/tex2jax.js

2012年12月7日金曜日

defineq

Interlispにはdefineqと言う特殊形式がありました。これはグローバル環境で一気に関数を複数定義出来る機能です。Common Lispで言うとlabelsの大域関数版、Schemeで言うとletrecのグローバル手続き版、って言ったところでしょうか。
Scheme(R5RS)でのdefineqの定義は以下の通り、です。
(define-syntax defineq
(syntax-rules ()
((_ (var e) ...)
(begin (define var e) ...))))
view raw defineq.scm hosted with ❤ by GitHub
まあ、シンプルで大したマクロじゃないですね。取り立てて役に立ちそうには見えないですし。
何に使うか、みたいなのは次回で。
ちなみに、SchemeのR5RSマクロでの大域環境での何らかのセッティングは、複数のテンプレを一気に変換先として設定しても上手く反映出来ません。と言うかまさしく引っかかるのは複数のdefineなんですけどね。
唯一defineを、クロージャ関係無しに囲めるのはbeginだけ、なんで、それこそお約束通りに「逐次実行」のbeginで、こう言う場合は包んでしまいましょう。

2012年11月30日金曜日

Pythonで継続渡し(CPS)


  1. なんでも継続からleaf-count/cps
    def leaf_count(tree, cont):
    if isinstance(tree, list):
    if tree == []:
    cont(0)
    else:
    leaf_count(tree[0],\
    lambda n :\
    leaf_count(tree[1:],\
    lambda m : cont(m + n)))
    else:
    cont(1)
    view raw leaf-count.py hosted with ❤ by GitHub
  2. SchemeとActor理論から_fact
    def add(x, y, k):
    k(x + y)
    def subtract(x, y, k):
    k(x - y)
    def multiply(x, y, k):
    k(x * y)
    def isequivalent(x, y, k):
    k(x == y)
    def fact(n, k):
    isequivalent(n, 0, \
    lambda u : \
    k(1) \
    if u \
    else subtract(n, 1, \
    lambda v :
    fact(v, \
    lambda w :
    multiply(n, w, k))))
    view raw fact.py hosted with ❤ by GitHub