作爲對this question的迴應,我一直在使用宏天堂分支在Scala中實現Haskell風格的'where'表達式。代碼可在scala-where獲得。現在我可以寫類似如下:Scala無類宏在中綴位置
val result = where (f1(1) * f2(2), {
def f1(x : Int) = x + 1
def f2(x : Int) = x + 2
})
不過,我真正想要做的是能在綴的位置稱之爲:
val result = (f1(1) * f2(2)) where {
def f1(x : Int) = x + 1
def f2(x : Int) = x + 2
}
通常情況下,這樣的事情會很容易,但我不明白如何通過宏調用來實現。表達式(f1(1)* f2(2))在宏應用程序之前不會鍵入,因此類似構建隱式值類不起作用。有沒有辦法得到這種語法呢?
如果做不到這一點,只是有兩個參數列表,這樣一個可以這樣做:
val result = where (f1(1) * f2(2)) {
def f1(x : Int) = x + 1
def f2(x : Int) = x + 2
}
將是很好的,但這又似乎很難。我們可以用兩個參數列表調用宏嗎?
兩個參數列表的是偉大的,謝謝!我不知怎的錯過了。 – Impredicative 2013-03-07 09:26:38
關於隱式轉換 - 我不知道如何掛鉤到宏系統。我不認爲這可能是一個隱式轉換,因爲肯定必須鍵入該樹才能搜索轉換? – Impredicative 2013-03-07 09:28:07
你可能是對的,雖然我認爲你可以做'implicit def conv = macro conv_impl; def conv_impl(c:Context)(x:c.Tree):c.Expr [T]'並且基本上是類型'Any => T' – 2013-03-07 18:48:47