Я пытаюсь написать игрушечный интерпретатор схемы python, основанный на метакруговом оценщике в SICP. Поскольку python поддерживает только стек вызовов с ограниченной глубиной, я должен устранить хвостовые вызовы. Я читал о батутах и реализовал с ним парсер.Как написать функции анализатора/оценщика, такие как `eval-if` в форме CPS?
Но я не знаю, как написать функции анализатора/оценщика в стиле продолжения, чтобы использовать их с батутами. Например, 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?
Спасибо :) Я выполнил [эту статью] (http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.45.5447&rep=rep1&type=pdf) для реализации планировщика трамплинов 'pogo_stick'. У меня возникли трудности с написанием этих функций в python, так как он будет включать в себя множество внутренних функций. Дело хуже, если я думаю о разделении анализатора с 'eval'. Для оценки '(set! Var expr)', 'expr' следует сначала проанализировать, а затем выполнить, оба этих шага будут заключены в планировщик' pogo_stick'. Может быть, я должен подумать о других способах оптимизации хвостового вызова? Извините, это немного расплывчато. –
Yup. Вы следуете плану, подобному тому, что я сделал с моей реализацией PyScheme (https://hkn.eecs.berkeley.edu/~dyoo/python/pyscheme/). Удачи вам в реализации! – dyoo
@dyoo, я прочитал некоторые из ваших кодов PyScheme, это очень помогает мне, когда я был смущен :). –