4

是否可以在 nodejs 的服务器端从其他简单的 javascript 文件中需要 fay 编译的模块?那太好了。也许编译器中有一些选项可以生成与 commonjs 兼容的模块?

4

2 回答 2

1

可以使用来自 javascript 的 fay 代码,但目前它有点冗长,您需要使用完全限定名称并手动强制函数调用。

var m = new Main();
document.body.innerHTML = "The 10th fibonacci number is : " + m._(m.Main$fibN(9));

此刻 Main 中的一切都是平的,我们希望将每个模块的编译分开,以便每个模块都可以单独输出。(然后我们也可以迁移到haskell-packages

然后我们需要输出一个包装器,该包装器为每个模块执行强制和类型转换,因此当从 JavaScript 调用时您不需要手动执行此操作。

以下是一些相关的门票:#279 , 260

于 2013-06-23T10:50:18.553 回答
1

这可能是个坏主意,因为它在很大程度上取决于 fay 生成的代码的特性。

请注意以下几点:

  • 无论编译模块的名称如何,fay 都会实例化到变量main中。
  • 在 node.js 下, from 的返回值require是模块的modules.export(最初是相同的对象export-- 但不一定保持这种状态)。
  • 可以在使用 声明其范围之前使用变量var。引用的变量是相同的。它不关心它的源顺序,以及运行时发生的一切。
  • Fay 默认(即没有--library)可以实例化一个对象并执行main

值得注意的是,这意味着我们可以在 内main修改module.exportsexports导出 fay 代码。当然,我们必须使用 ffi,但这是一个相当简单的事情;以下,在没有编译的情况下--library(是的,有点违反直觉,并且确实确实证明了这是一个令人讨厌的黑客的假设,不是吗)在某种程度上起作用:

import FFI

main :: Fay ()
main = ffi "module.exports = main"

require从节点 'd 时,返回的对象的效果是

{ 'Main$main': 
   { forced: true,
     value: { value: [Circular] } },
  _: [Function: Fay$$_],
  '$': [Function: Fay$$$],
  '$fayToJs': [Function: Fay$$fayToJs],
  '$jsToFay': [Function: Fay$$jsToFay] }

有了对 Fay 内部表示的工作知识,就可以(尽管可能需要付出太多努力)为所有 thunk-forcing 等编写一个 javascript 包装器。

(我们可以做更多——事实上,通过更多的 ffi 工作,我们可以将所有绑定编写为 ffi 代码。不过,这有点愚蠢。)

于 2013-07-20T02:00:54.783 回答