Scala – 从DSL的apply方法中省略括号
发布时间:2020-12-16 18:10:57 所属栏目:安全 来源:网络整理
导读:我正在尝试创建一个DSL并遇到问题.我有这些定义: case class Var(name: String)case class Lam(v: Var,t: Var)val (a,b) = (Var("a"),Var("b")) 我希望能够这样做: scala a bLam(Var(a),Var(b)) 阅读括号删除规则,我发现我需要链接每个都带有一个参数的
我正在尝试创建一个DSL并遇到问题.我有这些定义:
case class Var(name: String) case class Lam(v: Var,t: Var) val (a,b) = (Var("a"),Var("b")) 我希望能够这样做: scala> a b Lam(Var(a),Var(b)) 阅读括号删除规则,我发现我需要链接每个都带有一个参数的函数,所以我创建了一系列执行构造的“构建器”类: class LamBuilderB(v: Var) { def apply(t: Var) = Lam(v,t) } class LamBuilderA { def apply(v: Var) = new LamBuilderB(v) } val = new LamBuilderA 我希望这会有效,因为每次申请只需要一个参数.但是,似乎放弃括号是合法的,因为它想要将参数视为方法名称: scala> (a)(b) res95: Lam = Lam(Var(a),Var(b)) scala> a b error: value a is not a member of LamBuilderA a b ^ 有没有想法如何在没有括号的情况下获得DSL语法? 奖金问题:我能得到这个吗?: scala> a.b Lam(Var(a),Var(b)) 解决方法
你可以使用4个一元前缀运算符(?,!,– )中的一个来非常接近:
trait Expr { def &(other: Expr) = Lam(this,other) def unary_~ = this } case class Var(name: String) extends Expr case class Lam(a: Expr,b: Expr) extends Expr scala> ~ Var("a") & Var("b") res0: Lam = Lam(Var(a),Var(b)) scala> ~ Var("a") & Var("b") & Var("c") res1: Lam = Lam(Lam(Var(a),Var(b)),Var(c)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |