如何从Scheme程序中提取列表?

时间:2013-04-14 22:24:50

标签: scheme racket

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

1 个答案:

答案 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 ...)       | (否则身体......)

喝彩!