Lisp 理解包加载

Lisp 理解包加载,lisp,common-lisp,quicklisp,Lisp,Common Lisp,Quicklisp,(已解决,请参见备注) 最近我一直在开发一个API,它必须与一个已经存在的服务进行接口。一切似乎都运行得很好,我的项目刚刚开始变得足够大,我会看到将东西放入包中会带来一些好处。由于这是我在CL的第一个“真实”项目,我想我还没有完全理解这里正在进行的打包/加载机制 我的基本问题是,我有一堆代码,它们使用宏生成函数/类,将它们插入包中,然后导出某些函数/访问器,人们最终将使用这些函数/访问器与API交互。如果我像这样单独加载文件: (load "~/src/lisp/cl-bitcoin/bitco

(已解决,请参见备注)

最近我一直在开发一个API,它必须与一个已经存在的服务进行接口。一切似乎都运行得很好,我的项目刚刚开始变得足够大,我会看到将东西放入包中会带来一些好处。由于这是我在CL的第一个“真实”项目,我想我还没有完全理解这里正在进行的打包/加载机制

我的基本问题是,我有一堆代码,它们使用宏生成函数/类,将它们插入包中,然后导出某些函数/访问器,人们最终将使用这些函数/访问器与API交互。如果我像这样单独加载文件:

(load "~/src/lisp/cl-bitcoin/bitcoin.lisp")
(load "~/src/lisp/cl-bitcoin/classes.lisp")
(load "~/src/lisp/cl-bitcoin/functions.lisp")
一切正常。宏声明的函数被正确地插入和导出,我能够调用它们与API交互。但是,如果我尝试执行以下操作:

(ql:quickload :btc)

Quicklisp告诉我所有的东西都被正确加载了,而且似乎大多数加载过程都按照我的预期进行了,因为我的所有依赖项都已加载并可供使用。问题是与我的软件包相关的一切都不可用。这包括直接从my package.lisp文件导出的函数。以下是我的.asd和包文件供参考:

package.lisp

(defpackage #:btc
(:use #:cl)
(:export #:set-connection-parameters
     #:reset-rpc-id
     #:with-connection-parameters
     #:btc-base-err
     #:btc-base-id))
btc.asd

(asdf:defsystem #:btc
:serial t
:depends-on (#:drakma
             #:flexi-streams
             #:cl-json)
:components ((:file "package")
             (:file "bitcoin")
         (:file "classes")
         (:file "functions")))
我觉得我在这里遗漏了一些非常明显的东西-我一直在研究
eval when
和其他相关的加载函数,但还没有弄清楚这一点。有人能给我解释一下这是怎么回事吗

谢谢你的帮助

编辑:以下是我的REPL的外观:

; SLIME 2011-02-04
CL-USER> (ql:quickload :btc)
To load "btc":
  Load 1 ASDF system:
    btc
; Loading "btc"
..
(:BTC)
CL-USER> (btc:help "getinfo")
Invoking restart: Return to SLIME's top level.
; Evaluation aborted on #<SIMPLE-ERROR #x30200175DF0D>.
CL-USER> ; Reader error: No external symbol named "HELP" in package #<Package "BTC"> .
; No value
CL-USER> (load "/Users/jordan/src/lisp/cl-bitcoin/bitcoin.lisp")
#P"/Users/jordan/src/lisp/cl-bitcoin/bitcoin.lisp"
CL-USER> (load "/Users/jordan/src/lisp/cl-bitcoin/classes.lisp")
#P"/Users/jordan/src/lisp/cl-bitcoin/classes.lisp"
CL-USER> (load "/Users/jordan/src/lisp/cl-bitcoin/functions.lisp")
#P"/Users/jordan/src/lisp/cl-bitcoin/functions.lisp"
CL-USER> (btc:help "getinfo")
#<BTC::BTC-SINGLE #x3020017DBDDD>
CL-USER> 
将此发布为,但从未将其转换为答案:

事实证明,这只是一个不正确的配置问题 请听我说。。我不小心用错误的方式设置了项目 目录加载项目时,quickload实际上正在加载 与我期望的完全不同的.asd文件。所以 当我手动加载(正确的)文件时,代码工作正常 预期-quickload加载了错误的文件。非常感谢你的邀请 你的帮助,让我找到了原因


“问题是与我的包相关的所有内容都不可用。这包括直接从my package.lisp文件导出的函数。”请给出一个示例?什么是不可用的?你的意思是某些函数定义还没有被求值吗?或者没有导出符号?您遇到了什么意外行为?在我的
defpackage
中,我显式导出了5个函数-加载后,这些函数在我的
btc
包中都不可用。此外,我的宏将导出的所有符号(当我单独加载文件时,这些符号都已导出并在
btc
包中可用)在
快速加载后不可用
在我看来,函数定义没有被评估,因为导出在包声明中是显式的,但我不确定。你能告诉我们你得到的错误吗?很高兴听到你解决了它。你可以将其作为答案发布,并将其标记为已接受。这将有助于其他可能遇到相同情况的人(因为搜索问题和答案比搜索评论更容易),并有助于减少没有被接受答案的问题的数量。很高兴听到你解决了这个问题;快乐的口齿不清!
;;;; package information

(in-package #:btc)

;;; externally visible functions - this class contains the public api for
;;; cl-bitcoin as well as the function building framework that we need to
;;; easily handle the multiple return types that are possible from the
;;; bitcoind server methods

;; function building framework - resolving function return types into 
;; specific btc objects (as defined in classes.lisp)

(defun create-btc-obj (fn result err id)
  (case fn
    ((:getbalance :help) (make-btc-single result err id))
    (otherwise (error "Unable to parse function ~S to a btc object" fn))))

(defmacro defbtcfun (name &rest args)
  (let ((g (gensym)) (result (gensym)) (err (gensym)) (id (gensym)))
    `(progn
       (defun ,name ,args
     (let ((,g (intern (string ',name) :keyword)))
       (multiple-value-bind (,result ,err ,id) (get-bitcoind-result ,g ,@args)
         (create-btc-obj ,g ,result ,err ,id))))
       (export ',name 'btc))))

;; function definitions (each of these functions should have a corresponding case in 
;; create-btc-obj above, otherwise a condition will be signaled

(defbtcfun help method)

(defbtcfun getbalance account minconf)