我在Scala相对较新,而且我在与DSL挣扎。目前我正在尝试实现一种可以与某种自然语言一起使用的简单数学DSL。
我的想法:
打印(计算4加6)=>返回10
打印(计算4分钟2)=>返回2 ......等等
到目前为止,我已经实现了两个类。主要用于调用方法和计算类的主类。我的问题是我不知道如何将第一个数字传递给计算对象,因为不允许定义参数。
任何人都可以帮助一个例子吗?
答案 0 :(得分:2)
你会遇到一些麻烦,因为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可能对玩具来说很有趣,但我不确定它的实用性是什么。