【发布时间】:2019-03-18 18:46:26
【问题描述】:
我要编写的一个小 lisp 程序应该执行以下操作(复制自我的旧问题:LISP - Program to search a specific function through its parameters):
程序应该以两种不同的方式工作:
你给程序一个函数的名字,它应该返回函数参数。
你输入函数参数,如果存在带有这些参数的函数,它应该返回函数的名称。
我得到以下代码:
(defun get-name-by-params (database params)
(let ((matching-entries (remove-if-not (lambda (entry)
(equal (second entry) params))
database)))
(mapcar #'first matching-entries)))
(defun get-params-by-name (database function)
(let ((matching-entries (remove-if-not (lambda (entry)
(equal (first entry) function))
database)))
(flatten(mapcar #'second matching-entries))))
(defun flatten (L)
(if (null L)
nil
(if (atom (first L))
(cons (first L) (flatten (rest L)))
(append (flatten (first L)) (flatten (rest L))))))
使用该代码,我得到以下结果:
(get-params-by-name '((cons (t t) cons) (list (&rest t) list) (append (&rest lists) result)) 'append)
->(&REST LISTS)
(get-name-by-params '((cons (t t) cons) (list (&rest t) list)) '(&rest t))
->(LIST)
在这两种情况下,这正是我所需要的。我的任务的最后一个问题是我需要创建一个存储函数和参数的数据库,因为我需要向程序添加更多函数。
所以我需要创建一个存储以下数据的数据库
'((cons (t t) cons) (list (&rest t) list) (append (&rest lists) result))
并且,如果可能的话,可以由给定的函数处理。
谁能给我一个如何为这个任务创建数据库的例子?
【问题讨论】:
-
是否可以只使用defparameter?类似 "(defparameter functionlist '((cons (t t) cons) (list (&rest t) list) (append (&rest lists) result)))?
-
是的,它是这样工作的。
-
您可能喜欢持久(lisp)对象数据库:github.com/CodyReichert/awesome-cl#persistent-object-databases 创建 SQL 数据库的教程:lispcookbook.github.io/cl-cookbook/databases.html
-
正如上面提到的海报,我想知道您是否可以通过创建一个字面上存储函数的数据库,然后使用 SQL 语法查询该数据库来解决这个问题?这意味着要么在 Lisp 中创建一个数据库(这可能很有趣),要么使用一个持久性数据库。
-
您好,我认为为此使用任何类型的持久性数据库都太过分了。您可能想查看诸如 PCL gigamonkeys.com/book/practical-an-mp3-database.html 或 github.com/Wukix/LambdaLite 之类的内容。两者都需要根据您的目的进行一些修改,但将是一个很好的起点
标签: common-lisp