加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读