Programming languages 关于EOPL3练习6.31的提示
我正在读书。现在我坚持练习6.31 练习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
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)