仍在努力了解宏的最佳实践.我正在尝试编写一个动态定义包的宏.
(defmacro def-dynamic-package (name) `(defpackage ,(intern (string-upcase name) "KEYWORD") (:use :common-lisp)))
这适用于以下表达式:
(def-dynamic-package "helloworld")
但对于这样的事情惨遭失败:
(defun make-package-from-path (path) (def-dynamic-package (pathname-name path)))
要么
(defun make-package-from-path (path) (let ((filename (pathname-path))) (def-dynamic-package filename)))
我理解大多数基本宏是如何工作的,但是如何实现这个宏却让我感到惊讶.
defpackage是一个宏.因此,它在编译时扩展,而不是在运行时扩展.你想要的是在运行时调用以生成新包的东西.因此,defpackage无法为您做任何事情.
幸运的是,还有make-package,它提供了defpackage的功能.使用它而不是defpackage.