In risposta a this question, ho iniziato a implementare un'espressione 'dove' in stile Haskell in Scala utilizzando il ramo macro-paradiso. Il codice è disponibile allo scala-where. Ora posso scrivere qualcosa di simile al seguente:Macro non tipizzata Scala in infisso posizione
val result = where (f1(1) * f2(2), {
def f1(x : Int) = x + 1
def f2(x : Int) = x + 2
})
Tuttavia, quello che mi piacerebbe davvero fare è di essere in grado di chiamare questo in posizione infisso:
val result = (f1(1) * f2(2)) where {
def f1(x : Int) = x + 1
def f2(x : Int) = x + 2
}
Normalmente, questo genere di cose sarebbe facile, ma non riesco a vedere come farlo con la macro chiamata. L'espressione (f1 (1) * f2 (2)) non verrà digitata prima dell'applicazione macro, quindi qualcosa come la creazione di una classe di valore implicita non funziona. C'è un modo per ottenere questo tipo di sintassi altrimenti?
In mancanza di questo, basta avere due liste di parametri e quindi si può fare:
val result = where (f1(1) * f2(2)) {
def f1(x : Int) = x + 1
def f2(x : Int) = x + 2
}
sarebbe bello, ma anche questo sembra difficile. Si può chiamare una macro con due liste di parametri?
Due parametro cosa è grande, grazie! In qualche modo l'avevo perso. – Impredicative
Per quanto riguarda la conversione implicita, non sono sicuro di come ottenere l'hook nel sistema macro. Non penso che possa essere una conversione implicita, dal momento che sicuramente l'albero deve essere stato digitato per cercare le conversioni? – Impredicative
Forse hai ragione, anche se penserei che saresti in grado di fare 'implicit def conv = macro conv_impl; def conv_impl (c: Context) (x: c.Tree): c.Expr [T] 'e deve essere essenzialmente di tipo' Any => T' –