2012-02-15 8 views
2

저는 SICP의 메타 순환 평가 기 (meta-circular evaluator)를 기반으로 장난감 파이썬 Scheme 인터프리터를 작성하려고합니다. 파이썬은 제한된 깊이의 호출 스택만을 지원하므로 꼬리 호출을 제거해야합니다. 나는 trampolines에 대해 읽고 parser를 구현했다.CPS 폼에서`eval-if`와 같은 분석기/평가 기 기능을 작성하는 방법은 무엇입니까?

하지만 trampolines와 함께 사용할 연속 통과 스타일에서 분석기/평가 기 기능을 작성하는 방법을 모르겠습니다. 예를 들어, eval-if 기능 : 파이썬에서

(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 형태로 재귀 호출을 작성하려면 어떻게해야합니까? 이것이 당신의 '평가'는 또한 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 양식을 작성할 것입니다. 파이썬에서 Guido가 허용하는 경우 아마도 "lambda"를 사용할 수 있습니다. 그렇지 않으면, 당신이 이것에 대한 내부 함수를 정의 할 수 있다고 생각합니다.

+0

감사합니다 :) 나는'pogo_stick' 트램펄린 스케줄러를 구현하기 위해 [이 논문] (http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.45.5447&rep=rep1&type=pdf)을 따라 갔다. 필자는 파이썬에서 이러한 함수를 작성하는 데 많은 어려움을 겪고 있습니다. 내부 함수가 많이 포함되기 때문입니다. 분석기를'eval'에서 분리하는 경우를 생각해보십시오. '(set! var expr)'을 평가하기 위해서'expr'을 먼저 분석하고 실행해야합니다. 두 단계 모두'pogo_stick' 스케줄러에 포함됩니다. 꼬리 호출을 최적화하는 다른 방법을 생각해야할까요? 죄송합니다. 다소 모호합니다. –

+1

예. PyScheme 구현 (https://hkn.eecs.berkeley.edu/~dyoo/python/pyscheme/)에서했던 것과 비슷한 계획을 따르고 있습니다. 구현에 대한 행운을 비세요! – dyoo

+0

@dyoo, 나는 당신의 PyScheme 코드를 읽었으며, 혼란 스러울 때 많이 도움이됩니다 :). –