Kiedy próbuję budować wewnętrzne DSL w Scali, napotykam na wspólny problem i nie jestem w stanie stworzyć rozwiązania. Aby dokonać rzeczy wyglądają trochę bardziej jak typowy język, chciałbym składnia wyglądać mniej więcej tak:Skonstruuj listę z serii wyrażeń w Scali
model 'Foo {
decl 'Real 'x;
decl 'Real 'y;
}
W praktyce istnieje kilka problemów. Pierwszym problemem jest pobranie obiektu model
, który pobiera w ten sposób dwa argumenty. Jeśli ktokolwiek ma jakieś pomysły, daj mi znać. Ale to, co zrobiłem, a nie jest coś zrobić nieco więcej tak:
model('Foo) {
...
}
Jeżeli model jest teraz funkcja, która następnie zwraca obiekt z metody apply
który następnie zużywa lambda, który następuje. Z którym mogę żyć. Mógłbym żyć z podobnym problemem wewnątrz lambda, więc rzeczy takie jak decl 'Real 'x
lub w środku. Ale chcę uzyskać wyniki wszystkich tych wyrażeń w nawiasach klamrowych, aby uzyskać "zwrócony" jako listę. Innymi słowy, jest to, co chcę napisać coś takiego:
model 'Foo {
decl('Real,'x);
decl('Real,'y);
}
gdzie decl(...)
ocenia coś typu Declaration
a {...}
następnie ocenia się List[Declaration]
. Podejrzewam, że jest jakiś sposób użycia implicite, aby to zrobić, ale nie byłem w stanie go znaleźć. Krótko mówiąc, chciałbym, aby:
model 'Foo {
decl('Real,'x);
decl('Real,'y);
}
... ocenić do równowartości ...
model 'Foo {
decl('Real,'x) ::
decl('Real,'y) ::
Nil
}
uwagi lub sugestie?
Tak, widziałem to podejście z niektórymi deklaratywnymi interfejsami DSL GUI. Zgadzam się, że jest blisko. Miałem tylko nadzieję, że nie będę musiał() ogarnąć całej sprawy, a potrzeba użycia "," jest problematyczna, ponieważ za każdym razem, gdy chcesz dodać lub usunąć, musisz martwić się o to, że "między", ale nie na końcu. –
Zmodyfikowalem moją odpowiedź, aby odpowiedzieć na Twój komentarz. – paradigmatic
Ah, bardzo sprytny. Używanie składni konstruktora i metod zdefiniowanych lokalnie. Podoba mi się i myślę, że to może zadziałać. W rzeczywistości mogę go uprościć do "nowego modelu (" Foo) {...} ", który przycina kod. Miły sposób na wykorzystanie faktu, że squiggly nawiasy klamrowe w kontekście konstruktora pozwalają na łatwe wprowadzanie rzeczy w tym zakresie. Zastanawiam się, czy makra Scala 2.10 sprawią, że będzie to jeszcze prostsze? –