小编zlo*_*leo的帖子

从多个文件编译SML项目

我有一个包含许多文件的项目,我希望它能与大多数流行的编译器一起使用.

不幸的是,PolyML和SML/NJ需要use语句,而MosML还需要使用loadpoly或sml无法识别的基础库结构.

最重要的是,MLton和MLKit需要一个完全不同的.mlb文件,只需列出文件名,并且还需要显式导入基础库,这是以与MosML不同的方式完成的:

$(SML_LIB)/basis/basis.mlb
Run Code Online (Sandbox Code Playgroud)

是否有一些标准的通用"包含此文件"命令,如果它不存在,是否有其他方法让所有编译器从一个入口点文件中读取?

PS不会介意有人对编译器差异进行小吵闹.我总是对人们的想法感兴趣,而且没有太多可用的信息:-)

sml smlnj mlton polyml mosml

6
推荐指数
1
解决办法
288
查看次数

SML使用带签名的abstype

我正在编写一个库来处理Standard ML中的简单图像.它应该支持用作每个像素的颜色的不同类型,例如bool,Word8.word等.

我有一个abstype 'a image所有常见的函数定义独立于表示('a是颜色表示),但输出格式不同,所以我想有不同的结构.

有没有办法"打开" abstype一个结构内部?我只能以非常丑陋的方式工作:

abstype 'clr absimage = Image of {width : int, height : int, data : 'clr array array}
with
    fun createFunc (w, h) f = Image {width = w, height = h, data = ...}
    fun createBlank (w, h) clr = createFunc (w, h) (fn _ => clr)
    ...
end
signature IMAGE = sig
    type colour
    type image
    val createFunc : (int * int) -> (int * int -> …
Run Code Online (Sandbox Code Playgroud)

functional-programming sml abstract-data-type functor

4
推荐指数
1
解决办法
245
查看次数

当代码中有另一个不相关的函数时,"不是函数"错误

我有两段代码,每个代码都按预期工作:

function Test() {}

let tmp = function() {
    console.log(this)
}
tmp.call(Test)
Run Code Online (Sandbox Code Playgroud)

function Test() {}

(function() {
    console.log(this)
}).call(Test)
Run Code Online (Sandbox Code Playgroud)

它们都产生预期的输出:[Function: Test].

但是,当组合这些独立的代码片段时,会产生错误.所以,运行以下代码

function Test() {}

let tmp = function() {
    console.log(this)
}
tmp.call(Test)

(function() {
    console.log(this)
}).call(Test)
Run Code Online (Sandbox Code Playgroud)

结果是

TypeError: tmp.call(...) is not a function
Run Code Online (Sandbox Code Playgroud)

我找到了一个非优雅的解决方案,这为第二个代码片段添加了一个延迟.因此,以下将产生所需的输出([Function: Test]两次):

function Test() {}

let tmp = function() {
    console.log(this)
}
tmp.call(Test)

setTimeout(() => {
    (function() {
        console.log(this)
    }).call(Test)
}, 100);
Run Code Online (Sandbox Code Playgroud)

该超时似乎解决它这一事实使我认为这是相关的一些异步的东西,但我无法解释究竟为什么发生.

javascript this anonymous-function

4
推荐指数
1
解决办法
40
查看次数

指定 .constructor.name 为任意字符串

我知道有一种方法可以使其.constructor.name与构造函数存储的变量不同

var Foo = function Bar() {};
console.log(new Foo().constructor.name) // => Bar
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种 hacky 方法可以将对象设置.constructor.name为不是有效 JS 函数名称的名称,例如"Hello::World".

直接设置好像不行:

function Foo() {};
Foo.prototype.constructor.name = "Test"
console.log(new Foo().constructor.name) // => Foo
Run Code Online (Sandbox Code Playgroud)

我尝试过使用Function构造函数来执行此操作,但它是使用eval,因此尽管传递了字符串,JS 也必须有效。

javascript constructor function

1
推荐指数
1
解决办法
111
查看次数