我已经找到Funscript的例子了。现在,我正在尝试做一些类似Funscript库的东西,它有函数(希望还有类!)可以从javascript代码调用。但是我看不到从Funscript生成的.js中访问任何东西的方法。
简而言之,如何让Javascript调用Funscript?
发布于 2013-10-08 23:17:11
对不起,FunScript不是为这个用例设计的。它是为在脚本中使用来自不同来源的代码和数据而设计的,而不是作为库导出代码。
您会注意到FunScript生成的代码非常难看。我们最近稍微改进了它,但是这些更改只能直接从FunScript存储库获得(在编写本报告时)。要从其他基于JavaScript的语言中生成JavaScript,还有很长的路要走。
现在,改进代码生成并不是项目的高度优先任务。我们不希望在积极添加大量新功能的同时,以任何特定的样式/格式生成代码。另外,很难将F#中的一些概念映射到可消费和可执行的JavaScript中。例如:
为了说明泛型情况,假设在F#中有一个泛型函数,它使用比较约束对泛型类型的实例数组进行排序。首先,将它与诸如int这样的原始数字类型一起使用。其次,将它与记录类型一起使用。如果在这两种情况下都生成相同的JavaScript代码,并且通过调用某些方法(例如,对对象上的Compare(...) )来实现比较,这将导致数值情况下的性能非常差。为了获得更好的性能,需要对生成的代码进行一些专门化。在这里,可以内联映射到内置于JavaScript类型(如数字和字符串)的JavaScript类型的比较。这提供了更好的性能,但是,您现在有了多个JavaScript版本的同一个F#函数。没有一种清晰的方法可以以一种简单易用的方式呈现生成的代码。
总之,FunScript设计做出了一些权衡,优先考虑对泛型的支持、性能和反映,而不是代码生成。您可能想看一下WebSharper。它可以支持这个用例。
发布于 2014-01-11 11:37:28
您可以通过将函数放在window对象上来公开它们。例如:
[<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");https://stackoverflow.com/questions/19037579
复制相似问题