5

私は現在、ベクトル演算の小さな実装を書いています。ベクトルを操作する独自の «-» および «+» (およびその他の) 関数を定義したいと考えています。

また、これらすべての機能をパッケージに配置したいと考えています。

そして、この架空のパッケージ、たとえば «vec» という名前を付けて、次のように動作させたいと考えています。

  • パッケージ内で関数 «-» と «+» を定義しますが、(同じパッケージ内で) + または - を呼び出すと、Common Lisp ビルトインが呼び出されます。
  • +以前のことが不可能な場合は、ビルトインおよび-ascl:+およびを呼び出したいのですcl:-が、他の必要なすべての関数を から明示的にインポートする必要はありません:cl
  • パッケージをインポートするvecか、別のパッケージの定義のセクションでそれを言及すると:use、common-lisp パッケージの «-» と «+» は引き続き使用でき、パッケージ vec の関数は のように呼び出されるため、 と の間に(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 に答える