9

C / C ++では、ライブラリを作成し、ソースコードで#include ""を使用し、リンク時に-labcを使用して、ライブラリを静的なものまたはdllにすることができます。lispで同じ機能を使用するにはどうすればよいですか?

ディレクトリAのutil.lispの例として、ライブラリ関数helloを定義します。

(defpackage "UTIL"
  (:「COMMON-LISP」を使用)
  (:ニックネーム "UT")
  (:export "HELLO"))

(パッケージ内ユーティリティ)
(defun hello()
  (format t "hello、world"))

そして、このライブラリ関数をmain関数から使用してみてください。

(defun main()
  (ut:hello))
(主要)

私は試した

clisp main.lisp A / util.lisp 

しかし、私は次のメッセージを受け取りました

***-#から読む:「UT」という名前のパッケージはありません
  • ライブラリを使用するための#include""に相当するものは何ですか?
  • ライブラリをロードするための-lutilに相当するものは何ですか?ライブラリを使用するためのclisp/sbclのコマンドラインは何ですか?
  • そしてdefpackageの場合、これは名前空間と同等ですか?

追加した

ライブラリをロードする必要がありました。

("./A/util.lisp"をロード)

(defun main()
  (ut:hello))

(主要)

そして、「clispmain.lisp」を実行すると正常に動作します。

4

3 に答える 3

7

あなたが探しているものはシステムと呼ばれています。Common Lispdefpackageはこれとは何の関係もありません、そしてそうです、それは名前空間についてです。HyperSpec 、または馬鹿のガイド(以下のXachのコメントを参照)を参照して、詳細を確認してください

単にファイルをロードするように制限することもできますが、通常はシステム定義機能が使用されます。最近は主にASDFです。最小限の例:

(defsystem my-system
  :name "my-system"
  :version "0.0.1"
  :author "myself"
  :license "LLGPL"
  :description "it's a system."
  :serial t
  :components ((:file "packages")
               (:file "stuff")
               (:file "more_stuff")))

packages.lispにパッケージ定義が含まれる場合、stuffおよびmore_stuffは、ロードされるlispまたはfaslファイルです。このシステム定義(通常はfilename.asdという名前)は、ASDFがasdf:*central-registry*システムを見つけるために含まれているディレクトリにシンボリックリンクされている(またはそこにある)必要があります。次に、このようにシステムをロードできます。

(asdf:oos 'asdf:load-op 'my-system)

これに代わるものが、ASDFのより最近のバージョンで追加されました。

(asdf:load-system 'my-system)

または、スライムを使用する場合は、を押し,l my-system RETます。

于 2010-09-29T06:15:07.273 に答える
5

main.lispの前にutil.lispをロードする必要があります。

> (load "util.lisp")
> (load "main.lisp")
> (main)
hello, world
NIL

Practical Common Lispには、パッケージの定義と使用についての優れた入門書があります。

于 2010-09-29T06:04:40.473 に答える
1

Common Lispは画像ベースの言語ですが、通常はSmalltalkほどではありません。これは、ライブラリをイメージにロードするか、 LOAD(フォームで頻繁に明示的に使用される場合)を使用するか、通常はASDF(load (compile-file "your-file-here"))などのシステム定義機能を使用してライブラリを使用することを意味します。ロードされたコードは、将来コンパイル/ロードされるすべてのコードで使用できるようになります。

パッケージは確かに名前空間です。文字列のシンボルへのマッピングのみを処理し、ファイルや関数などに直接接続されていません。ファイルがパッケージを定義する前にパッケージを使用してファイルをロードしようとしたため、パッケージエラーが発生しました。

于 2010-09-29T06:09:51.433 に答える