Ошибка в вашем коде заключается в том, что вы создаете список на каждой итерации цикла. Сначала вы должны составить список, а затем добавить в него каждый элемент цикла!
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!!)
}
Это не механизм персистентности базы данных, но наиболее распространенный Шепелявит, имеют способ записать 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>)
Можно записать в поток (здесь, я использовал файл для удобства), таким образом, можно тривиально получить те байты и наполнить их в базу данных, если Вы желали.
Простуда могла бы быть тем, что Вы хотите. Это включает сериализуемые закрытия и сериализуемые продолжения.
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*))
Функции являются непрозрачными объектами, таким образом, у Вас не будет большой удачи при хранении их в файлах или чем-то как этот. Можно, однако, сохранить списки и скомпилировать их после извлечения от базы данных.
Это не поможет Вам сохранить закрытия, конечно. Это повлекло бы за собой хранение лексической среды наряду с кодом, ни один из которых у Вас есть (портативный) доступ к. Код, который Вы компилируете из сохраненных списков, должен будет положиться полностью на глобальные данные или данные, хранившие в базе данных.
Между прочим, обратите внимание, что Вы можете funcall символы, таким образом, Вам не нужна функциональная таблица для глобальных функций.
Можно изучить сохранение образов Lisp. Это позволяет сохранять "достаточно информации для перезапуска процесса Lisp в более позднее время". Можно было сохранить функции после загрузки их в изображение.
Это может также быть немного более усовершенствовано, чем, что Вы искали, но вот (очень) краткое введение в процесс: Сохранение Базового Образа
Будьте осторожны, что хранящий код может не быть настолько хорошим. Разработчики Zope научились ему на горьком опыте.