(已解决,见评论)
最近我一直在研究一个必须与现有服务接口的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告诉我所有内容都已正确加载 - 似乎大多数加载过程都按照我的预期发生,因为我的所有依赖项都已加载并可供使用。问题是与我的包相关的所有内容都不可用。这包括直接从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>
生成函数的代码:
;;;; 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)
答案 0 :(得分:0)
Jordan Kaye将此信息发布为a comment,但从未将其转换为答案:
事实证明,这只是一个不正确的配置问题 asdf由我..我不小心设置了项目 目录。加载项目时,quickload实际上正在加载一个 完全独立的.asd文件,而不是我期待的文件。所以, 当我手动加载(正确)文件时,代码工作为 期望 - quickload正在加载错误的文件。非常感谢 你的帮助,它让我找出原因!