我刚刚完成了IU的编译器课程,并试图在我的小“方案”中添加更多表格。我们通过语法糖将几种形式添加到我们的语言中,其中完整的方案通常使用宏扩展(和或者是主要的)。我遇到的问题是贬低cond声明。
作为一个注释:当我工作时,我在Chez和Petite Chez之间来回走动。
我正在尝试处理所有cond子句形式。处理(test => expr)表单时,我似乎遇到了使用=>的问题。如果没有错误的aux关键字错误或者该子句落入我的匹配语句中的下一行,我似乎无法做任何事情。
关于如何检测此关键字的任何想法?
答案 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