需要来自nodejs的fay代码

时间:2013-06-22 22:00:33

标签: node.js fay

是否可以在nodejs中从服务器端的其他简单javascript文件中获取fay编译的模块?那会很棒。也许在编译器中有一些选项可以生成commonjs兼容模块?

2 个答案:

答案 0 :(得分:1)

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

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

目前Main内部的一切都很平坦,我们想要分开每个模块的编译,这样每个模块都可以单独输出。 (然后我们也可以迁移到haskell-packages

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

以下是一些相关的门票:#279260

答案 1 :(得分:1)

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

请注意以下几点:

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

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

import FFI

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

require来自节点时,返回的对象是

的效果
{ '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代码。但这会有点愚蠢。)