5

仍在努力了解有关宏的最佳实践。我正在尝试编写一个动态定义包的宏。

(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)))

我了解大多数基本宏是如何工作的,但是如何实现这个让我无法理解。

4

2 回答 2

8

defpackage是一个宏。因此,它在编译时扩展,而不是运行时。您想要的是在运行时调用以制作新包的东西。因此,defpackage不能为您做任何事情。

幸运的是,还有make-package,它提供了defpackage的功能作为一个函数。使用它而不是defpackage

于 2008-11-11T08:03:54.473 回答
0

这里会出现失败,因为在不应评估其参数时使用了宏。

在您的第一个 make-package-from-path 中,def-dynamic-package 将接收一个列表作为参数,该列表等于以下表达式的值:

(list 'pathname-name 'path)

在您的情况下,您只需要一个功能:

(defun def-dynamic-package (name)
  (defpackage (string-upcase name)
    (:use :common-lisp)))

顺便说一句,如果您检查CLHS,您会发现defpackage的第一个参数不必是符号,而是任何字符串指示符

于 2008-11-11T01:08:46.823 回答