我正在自学编程语言理论,我想知道为什么我们需要一个Java虚拟机或任何虚拟机呢?根本原因是什么?
它只是为了让它成为多平台吗?如果是这样,为什么我们不能只为不同的平台提供独立于平台的语言和不同的编译器?
我正在 Typescript 中使用联合类型,我刚刚意识到它们可以用来表达多态性而不是继承。从 Java 开始,我会写这样的东西。
interface Smiley {
print(): string;
}
class Happy implements Smiley {
print() {
return ':-)';
}
}
class Sad implements Smiley {
print() {
return ':-(';
}
}
Run Code Online (Sandbox Code Playgroud)
另一方面,我可以用工会表达同样的事情
class Happy {
print() {
return ':-)';
}
}
class Sad {
print() {
return ':-(';
}
}
type Smiley = Happy | Sad;
Run Code Online (Sandbox Code Playgroud)
这些方法之间的理论或实践差异是什么?
我想到的是第一个允许 Smiley 类型的值是任何实现 Smiley 接口的值。第二个只允许笑脸高兴或悲伤,除此之外别无其他。
我还缺少什么吗?
我有这种问题.我在*.clj文件中包含Eclipse插件(表示为A)中包含的Clojure代码.我不想要AOT编译.但是,我需要从另一个Clojure插件B加载clojure代码.当B依赖于A时,这是可能的.Clojure可以轻松访问类路径,一切正常.但我希望插件A作为B的扩展插件.但是有一个问题,因为我找不到如何从B中包含的*.clj文件加载A中包含的Clojure文件的方法.我想使用Clojure'load'函数,它可以从类路径加载*.clj文件但是当我明确地启动这样的插件时,这个函数只是看不到插件A事件的内容
(org.eclipse.core.runtime.Platform/getBundle "A")
Run Code Online (Sandbox Code Playgroud)
对洛朗回答的反应
洛朗,非常感谢你!这很有趣.但是,我认为这可能解决了我原来的问题.你描述了如何从java插件中调用clojure代码,这完全是非常棒的.我需要从clojure插件调用clojure代码,我认为这可能更容易.我想我会创建扩展点并提供像这样的clojure函数
<extension point="transforms">
<function namespace="my.nemaspace" fn="my-transform"/>
</extension>
Run Code Online (Sandbox Code Playgroud)
所以IExecutableExtensionFactory我不需要任何魔法.我可以从clojure代码中读取扩展注册表.我不能做的是加载扩展中指定的功能.这是可行的还是我误解了什么?我注意到你正在使用clojure.osgi.这看起来很酷,该项目有任何文档吗?
clojure ×1
eclipse ×1
inheritance ×1
java ×1
jvm ×1
polymorphism ×1
typescript ×1
union-types ×1