Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Common lisp Common Lisp:如何在读取函数中选择符号所属的包_Common Lisp - Fatal编程技术网

Common lisp Common Lisp:如何在读取函数中选择符号所属的包

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

这似乎是一个非常简单的问题,但我仍然是CommonLisp的初学者。 我尝试加载如下文件。不带包装的符号
'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)))))
   ...))