2012-09-06 17 views
8

Tengo un programa con un montón de repetitivo (que, lamentablemente, no se puede reducir incluso con los mecanismos de Scala). Pero si hubiera una forma de generar clases complejas de alto nivel con una macro, todo lo que se repite desaparecerá. Por ejemplo:¿Será posible generar varias clases de nivel superior con una macro invocación en scala 2.10?

package org.smth 

generate(params) 

// becomes 

class A { ... } 
object B { ... } 
case class C { ... } 

¿Será posible con las macros Scala 2.10?

Respuesta

7

En resumen: no.

Macro types (es decir, macros que generan tipos en lugar de métodos) están planificados, pero no están diseñados ni especificados, ni mucho menos implementados todavía, y no serán para 2.10.

Además, una invocación de macro solo puede generar un solo tipo. Sin embargo, dado que se pueden anidar tipos (específicamente, object s), esto no es una limitación: solo puede generar un único nivel superior object que contenga todas las clases que necesita. La diferencia entre este y su código es básicamente una import declaración adicional:

package org.smth 

type O = Generate(params) 

// becomes 

object O { 
    class A { ... } 
    object B { ... } 
    case class C { ... } 
} 

// which means you need an additional 

import O._ 

pensaban de package macros que pueden generar paquetes enteros llenos de clases, pero se dio cuenta de que ya object s son un superconjunto de package s y tipo macros puede generar object s que no serían necesarios.

+1

¿Pero es posible generar clases internas en las macros de métodos ahora? Como 'val a = {clase A {...}; nuevo A smth} '? – Rogach

+2

Sí, es posible, pero las clases locales no necesitan registrarse en una tabla de símbolos global, por lo que es simple. –

+1

Cualquier código ejemplos/gist? – ZiglioUK

Cuestiones relacionadas