我正在编写一个用于从javascript代码生成php检查的小工具,我想知道是否有人知道将功能代码转换为命令式代码的标准方法?
我发现了这篇论文:Defunctionalization at Work它很好地解释了非功能化。
Lambdalifting和defunctionalization在某种程度上回答了这个问题,但是对于数据结构而言,我们仍然在解析列表,好像它们都是链接列表一样。是否有办法将函数式语言的链表转换为其他高级数据结构,如c ++向量或java arraylists?
答案 0 :(得分:3)
以下是@Artyom列表的一些补充:
y = f x
相同,则x := f x
可替换为y
答案 1 :(得分:2)
也许您有兴趣删除一些语言元素(例如高阶函数),对吗?
为了从程序中消除HOF,有一些技术,如defunctionalization。要删除闭包,可以使用lambda-lifting(也称为闭包转换)。这是你感兴趣的东西吗?
我认为您需要提供您拥有的代码的具体示例,以及您打算生成的目标代码,以便其他人可以提出解决方案。
添加了:
是否有办法将函数式语言的链表转换为其他高级数据结构,如c ++向量或java arraylists?
是。链接列表用C ++中的指针表示(具有两个字段的结构“节点”:一个用于“有效负载”,另一个用于“下一个”指针;空列表则表示为NULL指针,但有时人们更喜欢使用特殊的“哨兵价值”)。请注意,如果源语言中的代码不依赖于单链表的表示(在源语言实现中),您还可以使用目标语言中的向量实现“cons”/“nil”操作(不是确定这是否符合您的需求)。这里的想法是为熟悉的操作提供替代实现。
答案 2 :(得分:1)
不,没有。
原因是没有像functional code
或imperative code
这样具体且定义明确的内容。
此类转换仅适用于抽象的具体实例:例如,存在从Haskell代码到LLVM字节码,F#代码到CLI字节码或从Frege代码到Java代码的转换。
(我怀疑是否有一个从Javascript到PHP。)
答案 3 :(得分:1)
取决于您的需求。通常的答案是“没有这样的工具”,因为结果将无法使用。不过从这个角度看这个:
计算机中的汇编程序指令集定义了命令式计算机。因此编译器需要进行这样的翻译。但是我假设你不想拥有汇编程序代码但更具可读性。
通常这些繁重的程序转换是手动完成的,如果一个人对结果感兴趣,或者如果人类永远不会看到结果则会自动完成。