我一直在使用Scheme语言。
(define-datatype statement statement?
(add1 (V symbol?))
(sub1 (V symbol?))
(skip (V symbol?))
(if-goto (V symbol?)
(l symbol?)))
(define-datatype instruction instruction?
(labeled (l symbol?)
(i statement?))
(unlabeled (i statement?)))
(define-datatype program program?
(a-program (l (list-of instruction?))))
我正在尝试创建一个能够将程序转换为指令列表的新函数。我该怎么做呢?
这是我到目前为止所做的:
(define pgm->list
(lambda (pgm)
;what goes here
答案 0 :(得分:1)
对不起,如果这是错误的,如果它可以共享您的代码的工作实现?
我真的很困惑(define-datatype program program?
(a-program (l (list-of instruction?))))
什么是列表?我想在这里你想要声明一些程序变体。 a程序将被定义为指令列表......好的。如果list-of返回一个lambda,它是一个正确的谓词(只有当在一个指令列表上作用时才返回true) 这有用吗?
(define pgm->list
(lambda (pgm)
(cases program pgm
(a-program (l) l))))
编辑:由于除了OP之外我们大多数人都不知道define-datatype,我正在添加一些文档:
[syntax](define-datatype TYPENAME [PREDICATE] VARIANT ...)
定义名为TYPENAME的记录类型,其中VARIANT ...定义一个或多个 这种类型的实例的构造函数。 VARIANT应该是
的形式VARIANT =(CONSTRUCTOR(FIELDNAME FIELDPRED)......)
CONSTRUCTOR是将使用as定义的构造函数过程的名称 指定字段的许多参数。 (FIELDNAME FIELDPRED)...指定名称 对于每个字段和一个应该返回真值的段的过程 法律字段价值。
可选的PREDICATE应该是将要定义的过程的名称 当应用于此变体记录的实例时返回#t。
[语法](案例TYPENAME EXP CLAUSE ...)
用于匹配和解构变体记录的实例EXP的工具 名称为TYPENAME。每个CLAUSE都指定一个带有字段名称和构造函数的构造函数 构造函数与记录实例匹配时要执行的主体:
CLAUSE =(CONSTRUCTOR(FIELDNAME ...)BODY ...) | (否则身体......)
喝彩!