我是 Ceylon 的新手,目前正在探索如何将一些用 TypeScript(本质上是 JavaScript)编写的现有软件移植到 Ceylon,以便它可以在 JavaScript 引擎和 JVM 上运行。
有谁知道如何在 Ceylon 编写等效的 Java 代码:
public class Engine { ... } // Some given class definition
public interface Cont extends Callable1<Cont,Engine> {}
哪里Callable1<Y,X>
是 Ceylon 的 Java 等价物Callable<Y,[X]>
。
这个想法是,一个实例Cont
,比如说命名c
,将是一个函数,要么返回另一个Cont
,要么返回一个null
.
在 Java 中,使用它的代码如下所示:
// Somewhere
public static void exec(Cont c, Engine e) {
while (c != null) c = c.call(e);
}
(这本质上是一个蹦床,每个被调用的函数都返回延续,或者null
当计算完成时。)
另外,在锡兰我想将函数作为 Cont 的实例传递。
阅读回复后,我提出了以下解决方案,该解决方案同时使用了正确的结果类型(Cont?
而不是Anything
)和null
-testing(用于性能):
shared interface Cont { shared formal Cont? call(Engine e); }
// A wrapper class for an actual continuation function
class ContWrap(Cont?(Engine) fun) satisfies Cont {
shared actual Cont? call(Engine e) => fun(e);
}
shared Cont wrap(Cont?(Engine) fun) {
return ContWrap(fun);
}
// Somewhere
shared void exec(variable Cont? cont) {
while (exists cc = cont) {
cont = cc.call(this);
}
}
这适合我,代价是每次都创建一个额外的小对象,并通过wrap
.