Scheme - 检测aux关键字

时间:2012-05-02 11:23:20

标签: scheme keyword syntactic-sugar

我刚刚完成了IU的编译器课程,并试图在我的小“方案”中添加更多表格。我们通过语法糖将几种形式添加到我们的语言中,其中完整的方案通常使用宏扩展(和或者是主要的)。我遇到的问题是贬低cond声明。

作为一个注释:当我工作时,我在Chez和Petite Chez之间来回走动。

我正在尝试处理所有cond子句形式。处理(test => expr)表单时,我似乎遇到了使用=>的问题。如果没有错误的aux关键字错误或者该子句落入我的匹配语句中的下一行,我似乎无法做任何事情。

关于如何检测此关键字的任何想法?

1 个答案:

答案 0 :(得分:2)

我前段时间编写了自己的Scheme metacircular口译员,支持=>特殊形式的cond语法。从本质上讲,这就是我必须要做的事情:

(define (expand-actions clause)
  (let ((exp (sequence->exp (cond-actions clause))))
    (if (cond-has-then? clause)
        (make-application exp
                          (if (cond-else-clause? clause)
                              #t
                              (list (cond-predicate clause))))
        exp)))

当迭代cond表达式的所有子句(谓词和动作对)时,我展开每个动作并询问子句中是否存在=>标记(使用{{1} })。如果找到cond-has-then?,我将该子句的操作部分应用于谓词。

以下是负责评估我的解释器中=>个表达式的完整代码,主要过程(来自cond的一个)是eval,它转换{{1}表达式转换为一系列嵌套的cond->if表达式,并且还处理cond语法;我希望这对你有所帮助:

if