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)))))
참고 :
감사합니다 :) 나는'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' 스케줄러에 포함됩니다. 꼬리 호출을 최적화하는 다른 방법을 생각해야할까요? 죄송합니다. 다소 모호합니다. –
예. PyScheme 구현 (https://hkn.eecs.berkeley.edu/~dyoo/python/pyscheme/)에서했던 것과 비슷한 계획을 따르고 있습니다. 구현에 대한 행운을 비세요! – dyoo
@dyoo, 나는 당신의 PyScheme 코드를 읽었으며, 혼란 스러울 때 많이 도움이됩니다 :). –