¿Existe alguna solución de persistencia para Common Lisp, como Elephant, que permita la persistencia de la función? Actualmente, mi aplicación almacena un identificador en el archivo db y luego busca en una tabla de funciones, pero este método no permite almacenar funciones creadas dinámicamente.Función de persistencia en Common Lisp
Respuesta
No es un mecanismo de persistencia de base de datos, pero la mayoría de Lisps comunes tienen una forma de writing FASLs para todo tipo de objetos, incluidas las funciones. Por ejemplo:
cl-user(1): (compile (defun hello() (format t "~&Hello~%")))
hello
nil
nil
cl-user(2): (excl:fasl-write (symbol-function 'hello) "/tmp/hello.fasl")
t
cl-user(3): (excl:fasl-read "/tmp/hello.fasl")
(#<Function hello @ #x1000a964d2>)
puede escribir a una corriente (en este caso he utilizado un archivo por conveniencia), por lo que puede trivialmente capturar esos bytes y meterlas en una base de datos si hubiese deseado.
Las funciones son objetos opacos, por lo que no tendrás mucha suerte en almacenarlos en archivos o algo así. Sin embargo, puede almacenar listas y compile al recuperarlas de la base de datos.
Esto no le ayudará a almacenar cierres, por supuesto. Eso implicaría almacenar el entorno léxico junto con el código, ninguno de los cuales tiene acceso (portátil). El código que compila a partir de listas almacenadas deberá depender totalmente de los datos o datos globales almacenados en la base de datos.
Por cierto, tenga en cuenta que puede funcall símbolos, por lo que no necesita una tabla de funciones para funciones globales.
Puede buscar guardar imágenes Lisp. Esto permite guardar "información suficiente para reiniciar un proceso Lisp en un momento posterior". Puede guardar sus funciones después de haberlas cargado en su imagen.
Esto también puede ser un poco más avanzado que lo que estaba buscando, pero aquí es una (muy) breve introducción al proceso: Saving a Core Image
Common Cold podría ser lo que quieras. Incluye cierres serializables y continuaciones serializables.
Pascal Bourguignon dio un standard solution on comp.lang.lisp. Básicamente, debe escribir el formulario fuente en un archivo y COMPILE
y luego LOAD
.
(defvar *anon*)
(defun save-anonymous-function (fname args body)
(let ((fname (make-pathname :type "LISP" :case :common :defaults fname)))
(with-open-file (src fname :direction :output
:if-does-not-exist :create :if-exists :supersede)
(print `(defparameter *anon* (lambda ,args ,body)) src))
(compile-file fname)))
Luego tendrá que leer el archivo y guardarlo en su base de datos. Para recuperarlo, deberá recuperarlo de la base de datos y escribirlo en un archivo antes de cargarlo.
(defun load-anonymous-function (fname)
(let ((*load-verbose* nil)
(*anon* nil)) ; to avoid modifying the global one.
(load fname)
*anon*))
Tenga cuidado de que el código de almacenamiento no sea tan bueno. Los desarrolladores de Zope lo aprendieron de la manera difícil.
¿Qué se supone que significa eso? Un poco más explícito sería mucho más útil ... – AticusFinch
- 1. Asociación en Common Lisp
- 2. Secuencias en Common Lisp?
- 3. Webdevelopment en Common Lisp
- 4. Common Lisp a Lisp-n?
- 5. ¿Common Lisp equivalente a la función principal de Haskell? función
- 6. Una función de recopilación eficiente en Common Lisp
- 7. Common Lisp - Utilizando una función como entrada a otra función
- 8. Predijo Common Lisp
- 9. Best Common Lisp IDE
- 10. Dibujando árboles en Common Lisp
- 11. Renombrando lambda en Common Lisp
- 12. Eliminación de un tipo en Common Lisp
- 13. División entera en Common Lisp?
- 14. Palabra clave programática Common Lisp
- 15. ¿Eliminando el "misterio-consing" en esta función Common Lisp?
- 16. Clojure: ¿Equivalente a la función de lectura de Common Lisp?
- 17. Programación de Common Lisp Parallel
- 18. Especificadores de tipo Common Lisp
- 19. Ejercicios de Common Lisp/Problemas
- 20. Desenrolle/argumentos splat en Common Lisp
- 21. Uso de etiquetas en Common Lisp
- 22. Transposición de listas en Common Lisp
- 23. Introspección de clase en Common Lisp
- 24. Almacenamiento de fechas en Common Lisp
- 25. Common Lisp definición del paquete
- 26. raspando una tabla HTML en Common Lisp?
- 27. ¿El mejor framework web en Common-Lisp?
- 28. LET versus LET * en Common Lisp
- 29. Cómo implementar Multi-Threads en Common Lisp
- 30. Restablecer el estado en Common Lisp
Pero debe tener en cuenta que no está en el estándar CL. –