2012-02-15 4 views
2

私はSICPのメタ円形評価基準に基づいておもちゃのpython Schemeインタプリタを書こうとしています。 Pythonは限られた深さのコールスタックしかサポートしていないので、テールコールを排除する必要があります。私はトランポリンについて読んで、そのパーサーを実装しました。CPSフォームで `eval-if`のようなアナライザ/エバリュエータ関数を書くには?

しかし、アナライザ/エバリュエータ機能をトランポリンと一緒に使用するために継続的な通過スタイルで書く方法はわかりません。例えば、eval-if機能:Pythonで

(define (eval-if expr env) 
    (if (is-true? (eval (if-predicate expr) env)) 
     (eval (if-consequent expr) env) 
     (eval (if-alternate expr) env))) 

def eval_if(expr, env): 
    if is_true(eval(if_predicate(expr), env)): 
     return eval(if_consequent(expr), env) 
    else: 
     return eval(if_alternate(expr), env) 

私は述語が真であるかどうかを確認したい

が、私はそれに evalの新ラウンドを呼び出す必要があります。この種の再帰呼び出しをCPS形式で書くべきですか?これはあなたの「evalを」はまた、CPSで書かれていることを前提としていることを

;; evaluate an 'if': 
(define (eval-if expr env k) 
    (eval (if-predicate expr) env 
     (lambda (testval) 
      (if (is-true? testval) 
       (eval (if-consequent expr) env k) 
       (eval (if-alternate expr) env k))))) 

注:

答えて

3

はスキーム/ラケットでは、あなたは、この機能のCPSedフォームを記述します。 PythonではGuidoがあなたに許しているとすれば、おそらく "lambda"を使うことができます。さもなければ、私はあなたがこれの内部関数を定義できると信じています。

+0

ありがとう:) 'pogo_stick'トランポリンスケジューラを実装するために[この論文](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.45.5447&rep=rep1&type=pdf)をたどりました。私はこれらの関数を多くの内部関数を含むので、Pythonで記述するのは困難です。アナライザを 'eval'から分離することを考えると、ケースが悪化します。 '(set!var expr)'を評価するには、まず 'expr'を解析して実行し、2つのステップの両方を' pogo_stick'スケジューラに入れます。テールコールを最適化する他の方法について考えるべきでしょうか?申し訳ありません、少し曖昧です。 –

+1

PySchemeの実装(https://hkn.eecs.berkeley.edu/~dyoo/python/pyscheme/)で行ったのと同様の計画に従っています。実装には幸いです! – dyoo

+0

@dyoo、私はあなたのPySchemeコードの一部を読んだことがあります。 –

関連する問題