Programming languages 关于EOPL3练习6.31的提示

Programming languages 关于EOPL3练习6.31的提示,programming-languages,interpreter,continuation-passing,Programming Languages,Interpreter,Continuation Passing,我正在读书。现在我坚持练习6.31 练习6.31编写一个翻译器,获取程序的cps的输出和 生成一个等价的程序,其中表示所有的连续体 通过数据结构,如第5章所述。表示这样的数据结构 使用将数据类型定义为列表构建。因为我们的语言没有 符号,您可以在汽车位置使用整数标记来区分 数据类型的变体 我无法解决这个问题,因为我不知道结果程序应该是什么 看起来像例如,考虑下面的程序: +(1,(fx,(gy)) CPS之后,我们得到了以下计划: (f x (程序(v1) (g)y (程序(v2) (过程(v0

我正在读书。现在我坚持练习6.31

练习6.31编写一个翻译器,获取程序的
cps的输出
和 生成一个等价的程序,其中表示所有的连续体 通过数据结构,如第5章所述。表示这样的数据结构 使用
将数据类型定义为列表构建。因为我们的语言没有
符号,您可以在汽车位置使用整数标记来区分
数据类型的变体

我无法解决这个问题,因为我不知道结果程序应该是什么 看起来像例如,考虑下面的程序:

+(1,(fx,(gy))
CPS之后,我们得到了以下计划:

(f x
(程序(v1)
(g)y
(程序(v2)
(过程(v0)v0)
+(1,v1,v2()()))
在这里,位置
K
中的过程(如
(f x K)
是继续。这个 问题是我对
K
看起来像。一种可能性是:

(f x
(电话续)
(y)
(总和续1)
?
(续完)
然而,因为简单的表达被视为一个整体,我不知道如何表达 将
+(1,v1,v2)
转换为类似于中的
sum-cont1
sum-cont2
第五章。因此,我只能在数据结构中使用问号
代表性。在不知道等效程序的外观的情况下,它是 我不可能解决这个问题。谁能给点提示吗?
谢谢

您在CPS转换中犯了一个错误,请查看第216页,该页显示
(exp K的CPS)

(f x
   proc (v1)
      (g y
         proc (v2)
            (K +(v1, 33, v2))))
所以

+(1,(fx),(gy))

会变成

(f x
   proc (v1)
      (g y
         proc (v2)
            (K +(1, v1, v2))))
您添加了
(proc(v0)v0)
,但遗漏了
K


将其转换为数据结构的任务是应用去功能化。每个过程都由一个数据结构代替。回顾第5章第3节第163页,其中包括一个例子。apply cont函数将数据结构转换回延续过程

在本例中,我们希望数据结构表示调用函数f和g,一个表示调用带有一个值和两个参数的plus函数。对于加号延拓,我们需要2个值。g延拓将在其延拓中放入两个值,f延拓将在其延拓中放入一个值

所以像这样:

(f-cont x(g-cont y(加上ynn cont 1(exit cont)))


首先,我不认为这是一个错误,在我的转变。因为显示为延续的内容取决于传递的内容。我在示例中使用了一个CPSed函数作为延续,如第224页图6.12所示。也许我应该写一些类似于
(cps of exp)
,尽管这也不准确。但是非常感谢你的帮助!我现在知道我犯了什么错误:我把
(fxk)
K
看作两个不同的东西。相反,如果我需要完成翻译,CPSed结果应该被视为一个整体。再次感谢!
(apply-cont (f-cont x k))
 = (apply-cont k (f x))

(apply-cont (g-cont y k) val)
 = (apply-cont k (g y) val)

(apply-cont (plus-ynn z k) val1 val2)
 = (apply-cont k (+ z val1 val2))

(apply-cont (exit-cont) val)
 = (print val)