0

我一直在用 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
4

1 回答 1

1

抱歉,如果这是错误的,如果是,您可以分享您的代码的工作实现吗?我真的很困惑

(define-datatype program program?
  (a-program (l (list-of instruction?))))

什么是列表?我应该在这里想象你想声明一些程序的变体。a-program 将被定义为指令列表...好的。如果 list-of 返回一个作为正确谓词的 lambda(仅在对指令列表进行操作时返回 true),那么这是否有效?

(define pgm->list
  (lambda (pgm)
    (cases program pgm
      (a-program (l) l))))

编辑:由于除了OP之外我们大多数人都不知道define-datatype,我正在添加一些文档:

[语法](定义数据类型 TYPENAME [PREDICATE] VARIANT ...)

定义一个名为 TYPENAME 的记录类型,其中 VARIANT ... 为这种类型的实例定义一个或多个构造函数。VARIANT 的形式应为

变体 =(构造函数(字段名称 FIELDPRED)...)

CONSTRUCTOR 是构造函数过程的名称,它将使用与指定字段一样多的参数来定义。(FIELDNAME FIELDPRED) ... 指定每个字段的名称和一个参数的过程,该过程应返回合法字段值的真值。

可选的 PREDICATE 应该是将要定义的过程的名称,当应用于此变体记录的实例时,它会返回 #t。

[语法] (case TYPENAME EXP CLAUSE ...)

用于匹配和解构名为 TYPENAME 的变体记录的实例 EXP 的工具。每个 CLAUSE 指定一个带有字段名的构造函数和一个在构造函数与记录实例匹配时要执行的主体:

子句 = (构造函数 (字段名 ...) 正文 ...) | (否则身体...)

干杯!

于 2013-04-15T14:15:31.723 回答