Достигнуть приведенного ниже синтаксиса (для шаблонов дизайна фабрики) на любом скомпилированном языке?предпочтительно Kotlin, C ++ - PullRequest
0 голосов
/ 31 марта 2019

Я хочу знать, доступен ли приведенный ниже синтаксис для скомпилированного языка?Пожалуйста, не предоставляйте 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}`);

1 Ответ

1 голос
/ 31 марта 2019

Можете ли вы уточнить свой вопрос? Ваш предыдущий вопрос Как мне добиться приведенного ниже синтаксиса на любом скомпилированном языке? желательно Kotlin, C ++ на самом деле мне показалось понятнее. Не могли бы вы дать нам информацию о том, какой цели высокого уровня вы пытаетесь достичь?

Вы пытаетесь создать новый язык? Вы пытаетесь выбрать язык для реализации парсера вашего нового языка?

Исходя из своего кода, вы пытаетесь спроектировать язык, в котором классы хранятся в виде списка, в порядке объявления, а затем вы хотите иметь возможность создавать экземпляры всех этих классов, как-то итерируя список, и классы должен иметь возможность знать свой собственный индекс в списке для других целей?

Это то, что вы пытаетесь сделать?

В большинстве языков классы нельзя хранить в массивах. Они не являются реальными объектами. Но некоторые, такие как Smalltalk, Objective-C, Self или TADS, неявно создают объект для каждого класса, который содержит дополнительные данные (C ++ имеет атрофированную форму, называемую «информация о типе времени выполнения» или RTTI).

Если ваш язык реализации не делает этого, вам придется сделать это самостоятельно. Создайте объекты, которые содержат функцию, которая создает объект правого подкласса (и, возможно, содержит некоторую другую информацию, такую ​​как имя класса или индекс в списке, чтобы вы могли найти его снова), и добавьте этот объект «создатель» в глобальный список. Затем просто используйте этот глобальный список фабричных объектов для создания ваших экземпляров.

Вы не говорите, как вы создаете свой язык, хотя. Вы пишете инструмент, который читает текстовый файл на вашем языке и превращает его в исходный файл на существующем языке? Тогда этому инструменту нужно будет просто создать исходный код для нескольких дополнительных классов (например, для class B, он также создаст class B_Maker, который является подклассом class A_Maker, но создаст новый объект типа B, а затем он создаст некоторую функцию init(), содержащую код для создания нового объекта каждого производителя и добавления их в глобальный список).

Если вы изменяете LLVM или какую-либо другую существующую цепочку компиляторов или пытаетесь сделать это с нуля, базовый подход будет таким же (если только для каждого класса уже нет существующего объекта, который вы можете просто расширить), но вы не будете генерировать исходный код, но некоторые другие структуры данных, которые приводят к компиляции эквивалентного кода в конце.

Дайте нам больше контекста, и мы могли бы помочь.

...