如何在Funscript中导出接口

时间:2013-09-26 19:59:47

标签: javascript f# funscript

我已经有了Funscript示例。现在我正在尝试制作类似Funscript库的东西,它具有可以从javascript代码调用的函数(希望是类!)。但是我看不到从Funscript生成的.js访问任何东西的方法。

简而言之,我如何让Javascript调用Funscript?

2 个答案:

答案 0 :(得分:3)

很抱歉,FunScript不是针对此用例设计的。它旨在消耗脚本中各种来源的代码和数据,而不是将代码导出为库。

你会注意到FunScript生成的代码非常难看。我们最近略有改进,但这些更改只能直接从the FunScript repository获得(在撰写本文时)。在它生成可以从其他基于JavaScript的语言中使用的JavaScript之前,还有很长的路要走。

目前,改进代码生成不是项目的高优先级任务。我们不想承诺以任何特定的样式/格式生成代码,同时我们正在积极地添加大量新功能。此外,很难将F#中的一些概念映射到可消耗和高性能的JavaScript中。例如:

  • 通用类型,方法和功能
  • 通用类型约束(关于相等和比较的事情)
  • 反射

为了说明一般情况,假设在F#中,您有一个泛型函数,它使用比较约束来对泛型类型的实例数组进行排序。首先,将它与原始数字类型(如int)一起使用。其次,您将它与记录类型一起使用。如果为两种情况生成相同的JavaScript代码,并且通过在对象上调用某些方法Compare(...)来实现比较,则会导致数字情况的性能非常差。为了获得更好的性能,需要对生成的代码进行一些特化。这里可以内联映射到内置JavaScript类型(如数字和字符串)的F#类型的比较。这提供了更好的性能,但是,您现在拥有相同F#函数的多个JavaScript版本。没有一种明确的方式以易于使用的方式呈现此生成的代码。

总之,FunScript设计做了一些权衡,优先考虑支持泛型,性能和代码生成之类的事情。您可能希望查看WebSharper。它可能支持这个用例。

答案 1 :(得分:2)

您可以通过将函数放在窗口对象上来公开函数。例如:

[<ReflectedDefinition>]
module Program

open FunScript
open FSharp.Data
open System.IO

module Foo =
  let SayHello name = Globals.window.alert ("Hello, " + name)

[<JSEmitInlineAttribute("window.SayHello = {0};")>]
let expose(f : string -> unit) : unit = failwith "never"

// Create a function that will be compiled into JavaScript...
let main () =
  expose(Foo.SayHello)

然后,您可以从javascript访问它们:

window.SayHello("Ray");

或者,事实上,简单地说:

SayHello("Ray");