我想知道以下语法是否可用于编译后的语言?请不要提供java,因为它需要JVM。这种设计相当于工厂设计模式,因为我们初始化一个类,一旦一些测试通过,在正常情况下,我们使用大量的if-else语句,也就是说,当我们有一系列的类,即10个类时,代码变得笨重,我正在尝试创建一种转译或编译的语言,还没有决定这一点,并将研究目前使用kotlin-native和llvm (尚未排序的llvm集成)的已编译语言的特性功能。它是在启动时使用的,这也是我想要考虑使用的。
class A{
}
class B extends A{
}
class C extends A{
}
class D extends A{
}
class E extends A{
}
class F extends A{
}
class G extends A{
}
class H extends A{
}
class I extends A{
}
class J extends A{
}
class K extends A{
}
function getClass(test){
if(test == 1){
return new B()
}else if (test == 2){
return new C()
}else if (test == 3){
return new D()
}else if (test == 4){
return new E()
}else if (test == 5){
return new F()
}else if (test == 6){
return new G()
}else if (test == 7){
return new H()
}else if (test == 8){
return new I()
}else if (test == 9){
return new J()
}else if (test == 10){
return new K()
}
}
let klass = getClass(10)
console.log(`Found class ${klass.constructor.name}`)
class A {
static test(test) {
return test === this.index;
}
}
class B extends A{}
B.index = 1
class C extends A{}
C.index = 2
class D extends A{}
D.index = 3
class E extends A{}
E.index = 4
class F extends A{}
F.index = 5
class G extends A{}
G.index = 6
class H extends A{}
H.index = 7
class I extends A{}
I.index = 8
class J extends A{}
J.index = 9
class K extends A{}
K.index = 10
let klasses = [B, C,D,E,F,G,H,I,G,K];
let klass = new A();
let test = 7;
for (let i = 0; i < klasses.length; i++) {
try {
if(klasses[i].test(test)){
klass = new klasses[i]()
}
} catch (e) {
console.log(e)
}
}
console.log(`Found class ${klass.constructor.name}`);
发布于 2019-03-31 20:40:45
你能澄清你的问题吗?你之前的问题How can I achieve the below syntax in any compiled language? preferably Kotlin, C++对我来说似乎更清楚了。您能给我们介绍一下您正在尝试实现的高级目标吗?
你在尝试设计一门新的语言吗?您是否正在尝试选择一种语言来实现新语言的解析器?
根据您的代码,您正在尝试设计一种语言,其中类按声明的顺序作为列表保存,然后您希望能够通过以某种方式迭代列表来实例化所有这些类,并且这些类应该能够知道自己在列表中的索引以供其他用途?
这就是你想要做的吗?
在大多数语言中,类不能保存在数组中。它们不是真正的对象。但是像Smalltalk,Objective-C,Self或者TADS,它们会隐式地为每个包含额外数据的类创建一个对象(C++的缩写形式称为“运行时类型信息”,或RTTI)。
如果你的实现语言不能做到这一点,你就得自己去做。创建包含创建正确子类的对象的函数的对象(可能还包含一些其他信息,如类名或列表中的索引,以便您可以再次找到它),并将"maker“对象添加到全局列表中。然后,只需使用工厂对象的全局列表来创建实例。
你并没有说你是如何创建你的语言的。您是否正在编写一个工具来读取您所使用的语言的文本文件,并将其转换为现有语言的源文件?然后,该工具只需为一些额外的类创建源代码(例如,对于class B
,它还将创建一个class B_Maker
,它是class A_Maker
的子类,但它将创建一个新的B
类型的对象,然后它将创建一些包含代码的init()
函数,以创建每个maker的新对象并将其添加到全局列表中)。
如果您正在修改LLVM或其他一些现有的编译器链,或者尝试从头开始修改,那么基本的方法是相同的(除非每个类都已经有一个可以扩展的现有对象),但是您不会生成源代码,而是生成一些其他的数据结构,这些数据结构最终会导致编译等价的代码。
给我们更多的背景信息,我们也许能帮上忙。
https://stackoverflow.com/questions/55440369
复制相似问题