Вы можете создать базу данных на Лиспе вместо использования базы данных постоянного хранения, и вы можете сохранить данные в сериализованном формате для загрузки / сохранения базы данных. Вы были бы удивлены, но некоторые крупные компании, такие как Yahoo! сделал это в 90-х годах, и многие до сих пор делают это сегодня, вместо использования постоянной базы данных, такой как MySQL. Вот пример структуры программы, если вы хотите написать базу данных на Лиспе. Вы можете использовать CLOS для хранения функций как экземпляров этого класса. Вы говорите, что вам нужно имя функции и параметры функции. Таким образом, вы можете создать класс с атрибутами «имя» и «параметры». Вот пример:
(defclass functions()
((name :accessor func-name
:initarg :name)
(params :accessor func-params
:initarg :params
:initform '(nil))))
Мы можем создать класс со слотами для имени и параметров, как я показал выше, а затем мы можем создать экземпляры этого класса. Так что, если, например, у меня есть такая функция:
(defun foo (n lst)
(list foo))
Я могу создать экземпляр, подобный этому ...
(defvar func-1 (make-instance 'functions
:name "foo"
:params '("n" "lst")))
И если у меня есть такая функция:
(defun foo-2(lst n)
(list lst n))
Я могу создать еще один экземпляр, подобный этому:
(defvar func-2 (make-instance 'functions
:name "foo-2"
:params '("lst" "n")))
Теперь, как мы храним эти экземпляры в базе данных? У нас есть несколько вариантов, но простой и общий пример будет хранить экземпляры в списке. Мы могли бы увеличить сложность или даже создать собственную форму встроенного языка SQL с помощью макросов, но для простоты мы можем просто использовать список и функцию find для создания базы данных make-shift. Вот пример базы данных и двух функций для поиска в этой базе данных по имени функции или параметрам:
(defvar *func-db* nil) ;Create an empty list to store the functions
(push func-1 *func-db*)
(push func-2 *func-db*) ;Push a couple of functions to the DB
(defun find-params (name)
(func-params
(find name *func-db*
:test #'string-equal
:key #'func-name)))
(defun find-name (param-list)
(func-name
(find param-list *func-db*
:test #'equal
:key #'func-params))
Теперь мы можем создать пару функций, чтобы найти параметры функции на основе имени, которое мы ищем, или найти имя функции на основе введенных нами параметров. Я буду использовать строки в этом сценарии для простой иллюстрации, но вам, вероятно, следует использовать символы. Вот несколько примеров того, как мы будем искать в БД:
CL-USER> (find-params "foo")
("n" "lst")
CL-USER> (find-params "foo-2")
("lst" "n")
CL-USER> (find-name '("n" "lst"))
"foo"
CL-USER> (find-name '("lst" "n"))
"foo-2"
Именно так мы можем создать временную базу данных на Лиспе. Хорошая книга для чтения - «Практический общий Лисп». Есть бесплатная онлайн-версия, и в этой книге один из главных проектов - создание базы данных MP3. Самый простой пример - использование списка для хранения информации, а затем ее поиск. Если вы хотите сохранить базу данных для дальнейшего использования, вы можете сохранить ее в файл, а затем загрузить, когда захотите использовать ее снова. Этот метод может показаться простым, но я видел, как крупные компании используют его против MySQL. Вы даже можете создать свой собственный встроенный язык SQL для поиска информации, и, поскольку информация хранится в памяти, она может получать результаты даже быстрее, чем MySQL, если вы решили расширить этот проект и создать веб-приложение на Лиспе.