Common lisp Common Lisp:如何在读取函数中选择符号所属的包
这似乎是一个非常简单的问题,但我仍然是CommonLisp的初学者。 我尝试加载如下文件。不带包装的符号Common lisp Common Lisp:如何在读取函数中选择符号所属的包,common-lisp,Common Lisp,这似乎是一个非常简单的问题,但我仍然是CommonLisp的初学者。 我尝试加载如下文件。不带包装的符号'year “月份”等可以在每个文件中进行比较 ;;; file db.lisp ((year 2010 (month 5 (1 100 "A") (2 -5 "B")) (balance 10) (month 6 (1 -7 "C") (2
'year
“月份”
等可以在每个文件中进行比较
;;; file db.lisp
((year 2010
(month 5
(1 100 "A")
(2 -5 "B"))
(balance 10)
(month 6
(1 -7 "C")
(2 -8 "D")))
(load-from-csv-format-1 "db2011.csv")
(load-from-csv-format-2 "db2012.csv"))
我成功地将现有的lisp代码转换为以下代码
(defpackage :db
(:use :common-lisp :db.csv-format-1))
(in-package :db)
(defun read-db ()
(let ((db (with-open-file (stream "db.lisp")
(read stream))))
...
(case (car x)
(year (expand-year x))
(load-from-csv-format-1 (load-format-csv-format-1-impl (second x)))
(load-from-csv-format-2 (load-format-csv-format-1-impl (second x)))
...
现在所有符号都属于包:db
。这对我来说有一个缺点,就像
对read db
的所有调用都必须在:db
内完成。如果我现在想分开
所有不同的csv格式在不同的软件包中,它不再工作,因为
e、 g.下面的余额
属于无法比较的db.csv-format-1
包
针对db::balance
符号
(defpackage :db.csv-format-1
(:use :common-lisp)
(:export :load-from-csv-format-1-impl))
(in-package :db.csv.format-1)
(defun load-format-csv-format-1-impl (path)
(list 'balance 20))
所以我的问题是,如何在lisp中正确地实现这一点?一个人能不能指定以某种方式阅读,
在哪个包中创建符号,然后以某种方式访问这些符号
套餐?
这是它的读物
把包裹打开,这样你就可以
这样做:
PS。作为初学者,您可能会喜欢阅读中推荐的一些书籍。谢谢。CLHS有时非常简洁。@user1660596:yw。事实上,CLHS是一本参考书,而不是教科书。请看PS。
(defun read-db ()
(let* ((*package* (find-package #:db))
((db (with-open-file (stream "db.lisp")
(read stream)))))
...))