2010-09-10 10 views
10

Actualmente estoy aprendiendo D, y una de las cosas que me he preguntado es si D tiene una forma de duplicar las capacidades de generación de código de los lenguajes JVM.Generación de código de tiempo de compilación en D

Aquí hay un escenario: Tengo un objeto, y quiero generar una cadena basada en ese objeto que le da su nombre y todos sus campos. En Java/Scala, I podría solo usar la reflexión, pero suponga que la velocidad es un problema. Podría usar una biblioteca de generación de códigos de bytes para generar dinámicamente y compilar una clase que lo haga sin reflexión. La implementación se dividiría para iterar a través de los campos del objeto y obtener su nombre a través de la recursión, y usar esa información para generar dinámicamente Java (o bytecode) que acceda directamente a los campos.

Si no te gusta ese escenario porque es débil y/o poco realista, otro que podría ser más realista es la serialización de objetos optimizados.

He visto ejemplos donde la evaluación de tiempo de compilación de D's y/o la metaprogramación de plantillas se usa para precalcular la secuencia de fibonacci en tiempo de compilación y otros algoritmos recursivos, pero ¿hay alguna manera de hacer cosas como esta solo con el lenguaje y un compilador, o ¿necesitaría desarrollar un generador de código separado y ejecutarlo antes del compilador para obtener este tipo de funcionalidad?

Respuesta

5

Las mezclas de cadenas pueden acceder al espacio de nombres en el que están mezcladas. Eso incluye this.tupleof, que se puede usar para iterar los campos de una clase. Una plantilla de serialización podría aprovechar eso o forzar al usuario a especificar los campos para serializar a mano; es decir. class Class : ISerializable { int foo; Forble bar; mixin(genSerialize("foo, bar")); ... }

6

Esto no solo se puede hacer, prácticamente está hecho para usted en D2. Todo lo que necesita es una pequeña mezcla para convertir estas funciones de tiempo de compilación en funciones de tiempo de ejecución.

  • Para el nombre de la clase, todo lo que tiene que hacer es evaluar typeof(this).stringof dentro del ámbito de la clase.

  • Para obtener una lista de todos los campos, pruebe __traits(allMembers, typeof(this)) y luego filtre las cosas que no son un campo (std.traits será útil aquí).

+0

Por favor, ¿pueden considerar esto [publicar] (http://stackoverflow.com/questions/11314596/listing-a-classs-methods-trough-mixin)? – menjaraz

Cuestiones relacionadas