Scala DSL: объединение методов без параметров - PullRequest
6 голосов
/ 07 февраля 2012

Я создаю небольшой scala DSL и сталкиваюсь со следующей проблемой, решение которой у меня действительно нет. Небольшой концептуальный пример того, чего я хочу достичь:

(Compute
 write "hello"
 read 'name
 calc()
 calc()
 write "hello" + 'name
)

код, определяющий этот dsl, примерно такой:

Object Compute extends Compute{
  ...
 implicit def str2Message:Message = ...
}
class Compute{
 def write(msg:Message):Compute = ...
 def read(s:Symbol):Compute = ...
 def calc():Compute = { ... }
}

Теперь вопрос: как я могу избавиться от этих скобок после calc? Является ли это возможным? если да, то как? просто пропустить их в определении не поможет из-за ошибок компиляции.

Ответы [ 3 ]

3 голосов
/ 07 февраля 2012

Невозможно избавиться от круглых скобок, но вы можете заменить их. Например:

object it

class Compute {
 def calc(x: it.type):Compute = { ... }

(Compute
 write "hello"
 read 'name
 calc it
 calc it
 write "hello" + 'name
)

Чтобы немного расширить, всякий раз, когда Scala видит что-то вроде этого:

object method
non-reserved-word

Предполагается, что это означает object.method(non-reserved-word). И наоборот, всякий раз, когда он видит что-то вроде этого:

object method object
method2 object2

Предполагается, что это два независимых оператора, как в object.method(object); method2.object, ожидающих, что method2 будет новым объектом, а object2 методом.

Эти допущения являются частью грамматики Scala: она предназначена специально для этого.

3 голосов
/ 07 февраля 2012

хорошо, я думаю, я нашел приемлемое решение ... теперь я достиг этого возможного синтаксиса

 | write "hello"
 | read 'name
 | calc
 | calc
 | write "hello " + 'name 

, используя объект с именем "|", я могу написать почти тот код, который хотел.обычно, ";"нужен после calc, если он без параметров.Хитрость заключается в том, чтобы принять сам объект DSL (здесь его «|» на следующей строке).неявное использование этого параметра также позволяет calc в качестве последнего утверждения в этом коде.ну, похоже, что это точно невозможно сделать так, как я хочу, но это тоже нормально

0 голосов
/ 07 февраля 2012

Сначала попробуйте убрать скобки из определения calc. Во-вторых, попытайтесь использовать фигурные скобки вокруг целых вместо скобок. Фигурные скобки и круглые скобки не означают одно и то же, и я считаю, что круглые скобки лучше всего работают в однострочном коде (если не использовать точки с запятой). См. Также Какая формальная разница в Scala между скобками и скобками и когда их следует использовать?

...