eed3si9n/treehugger — Issue #4: parenthesis (式の優先順位を示すための括弧)
Author: xuwei-k
Created: 2012-02-14 17:49:51+00:00
State: open

例えば [これ](https://github.com/scalaz/scalaz/blob/v6.0.4/project/Boilerplate.scala#L8) を書いてみようとしたのですが、単に

```scala
VAL("file") := { ( REF("outputDir") INFIX("/") APPLY LIT("scalaz") INFIX("/") APPLY REF("fileName") ) DOT "asFile" }
```

だと

```scala
val file = outputDir / "scalaz" / fileName.asFile
```

となってしまいますし、 `BLOCK` を使って

```scala
VAL("file") := { BLOCK( REF("outputDir") INFIX("/") APPLY LIT("scalaz") INFIX("/") APPLY REF("fileName") ) DOT "asFile" }
```
とすれば、以下のようになって

```scala
val file = {
outputDir / "scalaz" / fileName
}.asFile
```

意味的にはあってますが、見た目が微妙に異なることになります。
もしくは、

```scala
VAL("file") := { PAREN( REF(OUTPUTDIR) INFIX("/") APPLY LIT("scalaz") INFIX("/") APPLY REF(FILENAME) ) DOT "asFile" }
```

とやってしまえば以下のようになるので

```scala
val file = (outputDir / "scalaz" / fileName).asFile
```
見た目上は全く同じにすることができてしまいますが、 `PAREN` はTuple構築用なのでおそらく間違った用途でしょうし。

というわけで、 **式の優先順位を示すためのカッコ** が見つけられなかったのですが。
**Tree** としては2番目で合っているので、中括弧の `BLOCK` と別に `(` と `)` の括弧もサポートするべきかのかどうか微妙なところだと思いますが