当您在调用 defpackage 宏时尚未创建符号时,您/应该如何从包中导出符号?
(defpackage :package-a
(:use :cl)
(:export :fruit-type :animal-type :orange :apple :peach :cat :dog))
(deftype fruit-type () '(member ORANGE APPLE PEACH))
(deftype animal-type () '(member CAT DOG))
(defparameter *other-symbol-names*
'("A1" "A2" "B1" "B2")) ;imagine a longer list here
;with names generated by a function
(defparameter *other-symbols*
(mapcar #'(lambda (sym-name)
(import (make-symbol sym-name))
(find-symbol sym-name))
*other-symbol-names*))
(mapcar #'export *other-symbols*)
(setf A1 32 A2 33 B1 34 B2 35)
还有另一个包
(defpackage :package-b
(:use :cl :package-a))
(in-package :package-b)
(format nil "~a ~a ~a ~a" |A1| |A2| |B1| |B2|)
我在“The Complete Idiot's Guide to Common Lisp Packages”中读到“现在您已经了解了可用于操作包的无数函数和宏,您不应该真正使用它们中的任何一个。相反,所有IMPORT、EXPORT、SHADOW 等的功能都汇总在一个名为 DEFPACKAGE 的宏中,这是您应该用于真实(非原型)代码的宏。”
我上面的代码中是否有代码异味?此外,您将如何导出其他符号(猫狗动物类型等——其中有很多)以避免重复?