templates - topic - temas para prestashop 1.7 3 gratis
Plantillas D: Coolest Hack (12)
El puente D / Objective-C usa plantillas para permitirle manipular objetos de cacao en D.
¿Cuál es el truco de metaprogramación algo más práctico que has hecho o visto en el lenguaje de programación D? Algo práctico significa excluir, por ejemplo, el raytracer en tiempo de compilación.
Las herramientas DParse en Scrapple son un generador de analizadores de plantillas. Sin embargo, ldc es el único compilador de D con un GC de tiempo de compilación en funcionamiento (pero incluso entonces tiene un par de bloqueos extrañamente aleatorios). He jugado un poco con eso y puedes hacer cosas interesantes como el análisis de archivos de configuración y esas cosas, pero hasta que un GC de compilación se ejecute por completo, no puedes hacer grandes cosas.
Mis favoritos serían ElemType y KeyType de tools.base:
template ElemType(T) {
alias typeof((function() {
foreach (elem; Init!(T)) return elem; assert(false);
})()) ElemType;
}
template KeyType(T) {
alias typeof((function() {
foreach (key, elem; Init!(T)) return key; assert(false);
})()) KeyType;
}
Una estructura de plantilla de tipo unida (no le permitirá hacer errores de unidad).
Un tipo de precisión arbitraria Genera código ASM en tiempo de compilación (antes de que el compilador lo haga)
En términos de la mejor versión , tendría que decir PyD de Kirk McDonald (y otras vinculaciones similares) ya que tienen una gran cantidad de trabajo en la detección y el manejo de muchos tipos diferentes, así como la generación de código complejo.
Dicho esto, PyD solo gana porque BLADE usa técnicamente CTFE, no plantillas.
En una nota más personal, las plantillas D han tenido un uso extensivo en un proyecto de investigación mío. Es un marco de simulación donde los módulos pueden definir sus propios tipos de datos privados. La exposición de un nuevo tipo de usuario al marco requiere una sola línea de código que crea un analizador XML para el tipo, así como el código de serialización / deserialización de red asociado.
Compila el hash de cadena de tiempo . Puede usar esto para ocultar cadenas incrustadas en su código. Solo busca "hash". bastantes otras muestras interesantes en esa página, también.
Responderé a mi propia pregunta porque esta no existía cuando la pregunté. Escribí un parche para el recolector de basura que usa plantillas e introspección de tiempo de compilación para generar la información de desplazamiento del puntero para tipos arbitrariamente complejos definidos por el usuario para permitir el escaneo de montón preciso, en lugar de hacer esto dentro del compilador.
Escribí una función memoize () cuyo encabezado es este (el código es un poco largo para pegar aquí):
memoria automática (TFunc) (Func TFunc);
Lo que hace es darle la dirección de una función, y devuelve un delegado fuertemente tipado (la misma firma y el tipo de retorno que la función original) que almacena en caché los valores de retorno de la función original, de modo que llamarla dos veces con el mismo parámetro solo llama a la función subyacente una vez. Por ejemplo, aquí hay una definición memorable y "recursiva" de la secuencia de Fibonacci que se ejecuta en tiempo lineal, en lugar de exponencial:
uint fib (uint n) {return n> 0? n> 1? memoize (& fib) (n - 1) + memoize (& fib) (n - 2): 1: 0; }
Puede llamarlo normalmente, como en: fib (1000);
Editar: el código anterior cuyo enlace publiqué era bastante horrible; esta versión es mucho más elegante .
Mixins para leer y escribir estructuras simples de un objeto Stream :
template TStructReader() {
private alias typeof(*this) T;
static T opCall(Stream stream) {
assert(stream.readable);
T ret; stream.readExact(&ret, T.sizeof);
return ret;
}
}
template TStructWriter() {
private alias typeof(*this) T;
void write(Stream stream) {
assert(stream.writeable);
stream.writeExact(this, T.sizeof);
}
}
Úselo así:
align (1) struct MyStruct {
... definitions here ...
mixin TStructReader;
mixin TStructWriter;
}
auto ms = MyStruct(stream);
ms.write(stream);
LuaD también usa metaprogramación para interactuar sin problemas con Lua. Puede registrar una clase completa con un solo comando.
Un ejemplo es la facilidad bitfields en la biblioteca estándar de D''s que genera código para la manipulación de campo de bits a partir de un diseño especificado por el usuario.
La instalación Tuple es otro ejemplo. Genera una tupla basada en tipos proporcionados por el usuario y nombres opcionales. No hay una gran cantidad de dinero generativo allí excepto para inyectar los campos nombrados, pero creo que es un ejemplo ilustrativo.
Sin saber de la hazaña de Lambert, agregué memoize a la biblioteca estándar; consulte aquí la documentación, aquí el código y aquí la discusión relacionada con el grupo de noticias.
Otra instalación en la que trabajé es una función de orden superior que tabula una función integral o de valor real (por ejemplo, ofrece una exponencial rápida). Eso aún no está listo para su lanzamiento.
Una vez que se permita la creación de objetos durante la compilación, será fácil crear, por ejemplo, motores de expresiones regulares que hagan toda la generación de autómatas durante la compilación.