Когда я пытаюсь построить внутренние DSL в Scala, я сталкиваюсь с общей проблемой, и я не могу создать решение. Чтобы все выглядело более похоже на типичный язык, я бы хотел, чтобы синтаксис выглядел примерно так:
model 'Foo {
decl 'Real 'x;
decl 'Real 'y;
}
На практике возникает несколько проблем. Первая проблема заключается в том, чтобы получить здесь объект model
для приема двух аргументов таким образом. Если у кого-нибудь есть идеи, дайте мне знать. Но вместо этого я сделал что-то более похожее на это:
model('Foo) {
...
}
Где модель теперь является функцией, которая затем возвращает объект с помощью apply
метода, который затем использует следующую лямбду. С которым я могу жить. Я мог бы жить с подобной проблемой и внутри лямбды, так что такие вещи, как decl 'Real 'x
или decl('Real,'x)
внутри. Но то, что я хочу сделать, это получить результаты всех этих выражений внутри волнистых фигурных скобок, чтобы получить «возврат» в виде списка. Другими словами, я хочу написать что-то вроде этого :
model 'Foo {
decl('Real,'x);
decl('Real,'y);
}
, где decl(...)
оценивается как что-то типа Declaration
, а {...}
затем оценивается как List[Declaration]
. Я подозреваю, что для этого есть какой-то способ использовать имплициты, но я не смог его найти. Короче говоря, я хотел бы сделать:
model 'Foo {
decl('Real,'x);
decl('Real,'y);
}
...оценку эквивалентной...
model 'Foo {
decl('Real,'x) ::
decl('Real,'y) ::
Nil
}
Комментарии или предложения?