【问题标题】:Coding style - ordering of expressions in blocks in Scala编码风格 - Scala 块中表达式的排序
【发布时间】:2013-03-06 14:30:22
【问题描述】:

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

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

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

【问题讨论】:

标签: scala


【解决方案1】:

一种有趣的方法可能是使用macro-paradise 中的untyped macro 提议来引入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)) 上构造一些东西才能调用它们。但这正是在宏解析之前无法正确输入的表达式,所以我不太确定该怎么做。是时候提出一个新问题了,我想!

【讨论】:

  • 谢谢,这很有趣。不幸的是,它给代码增加了一些混乱,所以我会留下这个问题,以防其他人想加入他的想法。
  • 值得注意的是,现在的语法比这要好一些。中缀位置目前是不可能的,尽管 Eugene Burmako 建议可以添加一些东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-31
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多