5

我目前正在编写向量算术的小型实现,并且我想定义我自己的«-» 和 «+»(也许还有其他)函数来对向量进行操作。

而且我还想将所有这些功能放在一个包中。

我想要这个假设的包,比如说它叫做«vec»,表现得像这样:

  • 在包内,我定义了函数«-» 和 «+»,但是当我调用+ 或 -(在同一个包内)时,会调用 Common Lisp 内置函数。
  • 如果以前不可能,我想调用 builtin+-as cl:+and cl:-,但无需从:cl.
  • 当我导入vec包时,或者在另一个包的定义部分提到它时:use,common-lisp包的«-»和«+»仍然可用,并且包vec的函数被称为like ,因此和(vec:+ v1 v2)之间没有名称冲突。vec:+cl:+

那么,什么被认为是实现这种行为的最佳(和正确)方法?

4

1 回答 1

6

不可能定义一个符号并同时从另一个包中+引用它。+

您不需要导入符号。如果它们被导出,您可以将它们用作foo:+. 如果它们没有导出,它们可以用作foo::+.

using如果您不想使符号在 using 包中可访问,那么(在编程意义上 - 确保将包作为向量操作的命名空间引入是有意义的)包是没有意义的。如果你想写vec:+,那么使用包是没有意义的VEC。只需从中导出符号VEC

仅作说明:

CL-USER 6 > (defpackage "VEC"
               (:use "CL")
               (:shadow cl:+ cl:-)
               (:export "+" "-"))
#<The VEC package, 0/16 internal, 2/16 external>

CL-USER 7 > (defun vec:+ (a b) (+ a b))
VEC:+

CL-USER 8 > (defun vec:- (a b) (- a b))
VEC:-

CL-USER 9 > (defpackage "GRAPH" (:use "CL"))
#<The GRAPH package, 0/16 internal, 0/16 external>

CL-USER 10 > (in-package "GRAPH")
#<The GRAPH package, 0/16 internal, 0/16 external>

GRAPH 11 > (defun foo (a b) (+ (vec:+ a b) 42))
FOO

注意,如果当前包是VEC,则+VEC:+. 对于 CL +,您需要编写CL:+.

永远记住:

  • 包在读取时解析。
  • 当前包确定在读取期间使用的默认包。更改当前包不会更改已读取的符号。
于 2013-11-08T09:44:50.767 回答