- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在寻找一种向Javascript中添加非抢占式多线程的非常特定形式的方法。 Mozilla的Javascript 1.7使用yield
支持本机协程,但我不希望使用特定于浏览器的解决方案。我看到了基于将带注释的Javascript代码转换为纯Javascript的延续或协程的几种实现。一些示例是StratifiedJS,Narrative Javascript和jwacs。
对于模拟的Javascript异步调用,我不需要功能全面的框架;我只需要将其用于我想实现的非常特定的用法。因此,上述库对我来说是一个过大的杀伤力。
有人可以指出我这种预处理器使用的基本“技巧”吗?是否有一些特殊的语言技巧可以使Java语言中的延续功能成为可能,但会产生一些额外的代码呢?欢迎任何相关引用。
最佳答案
这是延续传递样式。
Javascript是Lisp,但在语法上却穿着C。
由于Javascript是一种功能语言,因此可能会有真正的疯狂技巧,例如延续传递样式。但是这些技巧令人头痛。
总结中,延续是下一步的概念-可以像函数一样作为可调用的东西使用。有时,我也将延续性视为已保存的调用框架堆栈:您可以将函数调用的堆栈保存为执行状态,然后返回或只是“调用”此状态。
有人演示了通过将代码转换为延续传递样式,您可以获得延续的力量。哇!确实令人印象深刻:
只需进行源代码转换,您就可以拥有连续的能力。
现在,Javascript的问题在于它的C语法。用C语法很难进行源代码转换。使用Lisp语法会更容易,但仍然乏味且容易出错。
我们很幸运,有一些非常有才华的人为我们辛勤工作。这项艰苦的工作需要使用Javascript解析器,因为此转换的真正含义是什么?概括而言,这意味着对操作顺序进行重新排序,以使首先真正完成的工作排在最前面。
f(g(a + x))
a + x
,然后调用
g()
,然后调用
f()
。有三个子表达式。在CPS转换中,子表达式的结果传递给延续。这涉及创建许多内部辅助函数作为临时延续。如下所述,这可能变得复杂且乏味。
(define (pyth x y)
(sqrt (+ (* x x) (* y y))))
(define (pyth& x y k)
(*& x x (lambda (x2)
(*& y y (lambda (y2)
(+& x2 y2 (lambda (x2py2)
(sqrt& x2py2 k))))))))
function pyth(x, y) {
return Math.sqrt(x * x + y * y);
}
function pyth(x, y) {
return sqrt(add(mul(x, x), mul(y, y)));
}
function pyth_cps(x, y, k) {
mul_cps(x, x, function(x2) {
mul_cps(y, y, function(y2) {
add_cps(x2, y2, function(x2py2) {
sqrt_cps(x2py2, k);
})
})
});
}
关于javascript - 生成具有延续性的Javascript代码的诀窍是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9392235/
我是一名优秀的程序员,十分优秀!