В ответ на this question у меня есть идея реализовать выражение «где» в стиле Хаскелл в Scala, используя ветку макро-рай. Код доступен по адресу 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
Что касается неявного преобразования - я не уверен, как получить крючок в макросистеме. Я не думаю, что это может быть неявное преобразование, так как наверняка дерево должно было быть введено для поиска конверсий? – Impredicative
Возможно, вы правы, хотя я бы подумал, что вы сможете сделать 'implicit def conv = macro conv_impl; def conv_impl (c: Context) (x: c.Tree): c.Expr [T] 'и имеет ли он по существу тип' Any => T' –