Scala DSL、对象和中缀符号
在Scala中,如果我想实现DSL,有没有办法做到以下几点: 我有一个名为“Draw”的对象,其中包含函数Scala DSL、对象和中缀符号,scala,dsl,scala-2.8,infix-notation,Scala,Dsl,Scala 2.8,Infix Notation,在Scala中,如果我想实现DSL,有没有办法做到以下几点: 我有一个名为“Draw”的对象,其中包含函数def Draw(d:Drawable) 如何使其能够导入对象并在对象外部调用它,如: draw ball 如果球延伸了可拉伸特性?问题是我想在一种中缀符号中使用draw,但我不想通过表示函数draw的实现类/对象来限定它。我很快尝试了它,但可以通过使用对象来实现它。在那里,我不得不使用draw(ball)而不是draw ball,正如您所希望的: 欢迎使用Scala版本2.8.0.RC
def Draw(d:Drawable)
如何使其能够导入对象并在对象外部调用它,如:
draw ball
如果球延伸了可拉伸特性?问题是我想在一种中缀符号中使用draw,但我不想通过表示函数draw的实现类/对象来限定它。我很快尝试了它,但可以通过使用对象来实现它。在那里,我不得不使用draw(ball)而不是draw ball,正如您所希望的:
欢迎使用Scala版本2.8.0.RC2(Java热点(TM)64位服务器虚拟机,Java 1.6.020)
scala>特征可绘制{def doSomething}
定义特征可拉伸
scala>对象绘制{
def draw(d:可提取)=d.剂量
}
定义模块图
scala>val ball=new Drawable{def doSomething=println(“doing ball”)}
ball:java.lang.Object,带Drawable=$anon$1@3a4ba4d6
scala>导入绘图_
导入绘图_
scala>拉球
:11:错误:对象绘制中缺少方法绘制的参数;
如果要将其视为部分应用的函数,请使用“\u1”遵循此方法
抽签
^
scala>抽签(球)
打球
但是,通过将Draw定义为一个类,它确实起了作用:
scala>trait可绘制{def doSomething:Unit}
定义特征可拉伸
scala>类绘图{
def draw(d:可提取)=d.剂量
}
定义类绘制
斯卡拉>
scala>val ball=new Drawable{def doSomething=println(“doing ball”)}
ball:java.lang.Object,带Drawable=$anon$1@36a06816
scala>val d=新绘图
d:抽签=Draw@7194f467
scala>d牵引球
打球
我不完全确定为什么这与对象的工作方式不同,可能是一个bug,也可能是指定的行为。但是我现在没有时间去查它。你做不到。除了四个前缀运算符外,在任何运算符表示法中,第一个标记表示对象。以下线程可能会对其有所说明:总结:仅
~
,
、-
和+
可以用于中缀或一元运算符,但不能用于draw
。您的第一个版本的问题是Scala的“运算符表示法”需要一个显式接收器,这就是类示例工作的原因。我认为draw(ball)是可以接受的语法。我会在某个OpenGLPanel上的(x,y,z)上画(球)。这只是一个做一个小DSL的测试:)谢谢你的回答。顺便说一句:也许你可以接受一些填充符号,比如Draw->ball或其他什么……回到思考:)另一个选项是将Draw方法重命名为“the”。这样,您的示例将变成:“绘制球”。实际上,Felix可以通过使Draw
成为对象和ball
成为引用真实对象的隐式转换的匿名类的方法来实现。我怀疑他或其他任何人会喜欢这样,所以这个答案是+1。
Welcome to Scala version 2.8.0.RC2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_20).
scala> trait Drawable{def doSomething}
defined trait Drawable
scala> object Draw {
def draw(d:Drawable) = d.doSomething
}
defined module Draw
scala> val ball = new Drawable{def doSomething = println("doing ball")}
ball: java.lang.Object with Drawable = $anon$1@3a4ba4d6
scala> import Draw._
import Draw._
scala> draw ball
:11: error: missing arguments for method draw in object Draw;
follow this method with `_' if you want to treat it as a partially applied function
draw ball
^
scala> draw(ball)
doing ball
scala> trait Drawable{def doSomething: Unit}
defined trait Drawable
scala> class Draw {
def draw(d:Drawable) = d.doSomething
}
defined class Draw
scala>
scala> val ball = new Drawable{def doSomething = println("doing ball")}
ball: java.lang.Object with Drawable = $anon$1@36a06816
scala> val d = new Draw
d: Draw = Draw@7194f467
scala> d draw ball
doing ball