1

自从我开始使用 Scala 编程以来,我就被这种语言中看似自然的编码风格所吸引,这很容易用一个简单的例子来解释:

val a = {
def f1(p : Int) = ...
def f2(p : Int) =  ...
f1(12) * f2(100)
}

正如你所看到的,值的乘法,如果你想理解代码,这是你应该熟悉的第一个操作,直到最后一行才能找到。相反,您需要先通读拼图的各个部分(函数 f1、f2),然后才能了解它们的实际排列方式。对我来说,这使代码更难阅读。你是如何处理这个问题的——或者你根本不觉得这是个问题?

4

1 回答 1

1

一种有趣的方法可能是使用宏天堂中的无类型宏提议来引入where绑定,例如:

val a = (f1(12) * f2(100)) where {
  def f1(x : Int) = x + 1
  def f2(x : Int) = x + 2
}

被重写为您上面的代码。据我了解,无类型宏将允许不存在的标识符 f1 和 f2 在宏前类型检查之后存在。我认为重写应该相对简单,然后第二次类型检查会发现任何问题。然而,我从来没有真正写过任何宏,所以有可能这会失败!

如果可能的话,我认为这将是一个很好的形式(重写将解决执行顺序的问题)——如果我有时间,我可能会尝试编写它!

编辑:我已经尝试过写这篇文章,结果出乎意料地容易。代码可在github上找到。不幸的是,到目前为止我能做的最好的是:

  val result = where ( f1(1) * f2(2), {
    def f1(x : Int) = x + 1
    def f2(x : Int) = x + 2
  })

问题是 Scala 的中缀运算符只是方法调用,所以我需要在表达式 (f1(1) * f2(2)) 上构造一些东西才能调用它们。但这正是在宏解析之前无法正确输入的表达式,所以我不太确定该怎么做。是时候提出一个新问题了,我想!

于 2013-03-06T15:14:33.030 回答