2

我正在写一个用于从javascript代码生成php检查的小工具,我想知道是否有人知道将函数代码转换为命令式代码的标准方式?是否有将功能代码转换为命令代码的标准方式?

我发现本文:Defunctionalization at Work它解释了非常好的功能。

Lambdalifting和defunctionalization有些回答了这个问题,但是对于数据结构呢,我们仍然在解析列表,就像它们都是链表一样。有没有办法将函数式语言的链表转换成其他高级数据结构,如C++向量或java数组列表?

+1

这被称为“编译”,并且有几十种不同的技术。从这里开始:http://research.microsoft.com/en-us/um/people/simonpj/papers/pj-lester-book/ –

回答

3

这里有一些补充@Artyom名单:

  • 可以尾递归转化成循环和分配
  • 线性类型可用于引进任务,例如y = f x可以与x := f x替换如果x是线性的,并具有相同的类型y
  • 至少两种去官能化是可能的:当更换一个完整的一阶应用开关高阶应用雷诺兹型去官能和内联(但是递归函数并不总是可以内联)
1

不,没有。

原因是没有像functional codeimperative code这样的具体和明确的东西。

这样的转换只存在于抽象的具体实例中:例如,Haskell代码转换为LLVM字节代码,F#代码转换为CLI字节代码或将Frege代码转换为Java代码。

(如果有一个从Javascript到PHP我怀疑。)

1

取决于你所需要的东西。通常的答案是“没有这样的工具”,因为结果将不可用。不过从这个角度来看这个:

计算机中的汇编程序指令集定义了一个命令式机器。因此编译器需要做这样的翻译。不过,我认为你不想拥有汇编代码,但是更具可读性。

通常,这些繁重的程序转换是手动完成的,如果对结果感兴趣,或者如果结果永远不会被人看到,则自动完成。

2

也许你有兴趣去除一些语言元素(比如高阶函数)吧?

为了消除程序中的HOF,有一些技术,如去官能化。为了移除闭包,你可以使用lambda-lifting(又名闭包转换)。这是你感兴趣的东西吗?

我认为您需要提供具体的代码示例以及您打算生成的目标代码,以便其他人可以提出解决方案。

加了:

会不会有变换功能的语言的linkedlists成其他高级别数据结构,如C++载体或Java的ArrayList的方法吗?

是的。链表使用C++中的指针表示(一个结构“节点”有两个字段:一个用于“有效载荷”,另一个用于“下一个”指针;空列表然后表示为NULL指针,但有时候人们更喜欢使用特殊“哨兵值”)。请注意,如果源语言中的代码不依赖单个链接列表的表示(在源语言实现中),还可以使用目标语言中的矢量实现“cons”/“nil”操作(而不是当然,如果这符合你的需求,但)。这里的想法是为熟悉的操作提供替代实现。