Scala DSL — простая математика

Я относительно новичок в Scala и борюсь с DSL. В настоящее время я пытаюсь реализовать простой Math DSL, который можно было бы использовать с каким-то естественным языком.

Моя идея:

print(Calculate 4 plus 6)=> returns 10

print(Calculate 4 mins 2)=> returns 2 ... and so on

Пока я реализовал два класса. Основной класс, который служит только для вызова метода и класса вычисления. Моя проблема заключается в том, что я понятия не имею, как я могу передать первое число объекту расчета, потому что ему не разрешено определять параметры.

Может ли кто-нибудь помочь с примером или чем-то еще?


person Hellekin    schedule 14.04.2014    source источник


Ответы (1)


Вы столкнетесь с некоторыми проблемами, заставляя это чувствовать себя как естественный язык, поскольку естественная форма, которую Scala хочет разобрать, - это class-instance method argument method argument method argument ..., что довольно не похоже на английский.

Тем не менее, вот фреймворк, с которого можно начать, с большим количеством шаблонного синтаксиса, чтобы синтаксический анализ работал правильно.

object Now {
  class Value(val please: Double) {
    def plus(d: Double) = new Value(please + d)
    def minus(d: Double) = new Value(please - d)
    override def toString = please.toString
  }
  def calculate(d: Double): Value = new Value(d)
}

И вот это работает (после import language.postfixOps):

scala> Now calculate 4 plus 6 please
res1: Double = 10.0

Между прочим, уже есть очень хороший естественный способ попросить 4+6... это 4+6. Он работает для носителей многих разных языков, а также почти для всех компьютерных языков. Так что этот DSL может быть забавным для игрушки, но я не уверен, какова практическая польза.

person Rex Kerr    schedule 14.04.2014
comment
Можно назвать это Вежливой Арифметикой, хотя лично я предпочитаю диктаторский подход к работе с компьютерами… - person Randall Schulz; 15.04.2014
comment
Эй, спасибо за вашу помощь! На самом деле это было просто для практики =). Знаете ли вы более подходящие, но простые DSL для начала? - person Hellekin; 15.04.2014
comment
@ user3042626 - ScalaTest имеет очень похожий на английский язык DSL. - person Rex Kerr; 15.04.2014