Функциональная персистентность в языке Common LISP

Ошибка в вашем коде заключается в том, что вы создаете список на каждой итерации цикла. Сначала вы должны составить список, а затем добавить в него каждый элемент цикла!

fun convertRoomClass(course: List<Course>) : List<Courses> {
    val newList = mutableListOf<Courses>()
    course.forEach {
        val id = it.pathID
        val name = it.pathName
        val desc = it.pathDescription
        newList += Courses(id, name!!, desc!!)
    }
    return newList
}

Лучшее решение - использовать функцию карты

fun convertRoomClass(course: List<Course>) = course.map {
   Courses(it.pathID, it.pathDescription!!, it.pathDescription!!)
}
9
задан pupeno 20 May 2009 в 05:32
поделиться

6 ответов

Это не механизм персистентности базы данных, но наиболее распространенный Шепелявит, имеют способ записать FASLs для всех видов объектов, включая функции. Например:

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>)

Можно записать в поток (здесь, я использовал файл для удобства), таким образом, можно тривиально получить те байты и наполнить их в базу данных, если Вы желали.

4
ответ дан 4 December 2019 в 20:25
поделиться

Простуда могла бы быть тем, что Вы хотите. Это включает сериализуемые закрытия и сериализуемые продолжения.

2
ответ дан 4 December 2019 в 20:25
поделиться

Pascal Bourguignon дал стандартное решение на comp.lang.lisp. В основном необходимо записать исходную форму в файл и COMPILE это затем 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)))

Затем необходимо будет считать файл и сохранить его в базе данных. Для возвращения его, необходимо будет выбрать его от базы данных и записать его в файле прежде, чем загрузить его.

(defun load-anonymous-function (fname)
   (let ((*load-verbose* nil)
         (*anon* nil)) ; to avoid modifying the global one.
     (load fname)
     *anon*))
3
ответ дан 4 December 2019 в 20:25
поделиться

Функции являются непрозрачными объектами, таким образом, у Вас не будет большой удачи при хранении их в файлах или чем-то как этот. Можно, однако, сохранить списки и скомпилировать их после извлечения от базы данных.

Это не поможет Вам сохранить закрытия, конечно. Это повлекло бы за собой хранение лексической среды наряду с кодом, ни один из которых у Вас есть (портативный) доступ к. Код, который Вы компилируете из сохраненных списков, должен будет положиться полностью на глобальные данные или данные, хранившие в базе данных.

Между прочим, обратите внимание, что Вы можете funcall символы, таким образом, Вам не нужна функциональная таблица для глобальных функций.

1
ответ дан 4 December 2019 в 20:25
поделиться

Можно изучить сохранение образов Lisp. Это позволяет сохранять "достаточно информации для перезапуска процесса Lisp в более позднее время". Можно было сохранить функции после загрузки их в изображение.

Это может также быть немного более усовершенствовано, чем, что Вы искали, но вот (очень) краткое введение в процесс: Сохранение Базового Образа

1
ответ дан 4 December 2019 в 20:25
поделиться

Будьте осторожны, что хранящий код может не быть настолько хорошим. Разработчики Zope научились ему на горьком опыте.

0
ответ дан 4 December 2019 в 20:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: