2

Lispコードを使用して実行可能ファイルを作成しようとしていました。しかし、システム をロードする前にパッケージがないため、lispファイルをまったくコンパイルできませんhellowolrdhelloworld

;; test.lisp
(asdf:load-system :helloworld)

(defun main()
  (helloworld:start))


もちろん、helloworldシステムを作って入れました~/quicklisp/local-projects/helloworldシステムはエラーなしで正常にロードされました。

;; ~/quicklisp/local-projects/helloworld/helloworld.asd
(asdf:defsystem helloworld 
  :version "1.0"
  :components ((:file "package")))

;; ~/quicklisp/local-projects/helloworld/package.lisp 
(defpackage :helloworld
  (:use :common-lisp :asdf)
  (:export :start))

(in-package :helloworld)
(defun start()
  (format t "Welcome, ASDF"))


test.lisp明示的なロードなし でコンパイルしたい。私も挑戦use-packagedefpackageましたが失敗しました。

;; test.lisp
(asdf:load-system :helloworld)
(use-package :helloworld)

(defun main()
  (helloworld:start))


;; test.lisp
(asdf:load-system :helloworld)

(defpackage :test
  (:use :cl :asdf)
  (:export :main))

(in-package :test)

(defun main()
  (helloworld:start))


helloworldシステムで定義されたパッケージhelloworldをロードせず に使用するにはどうすればよいですか? システムを使用して新しいシステムを作成する必要がありhelloworldますか?

4

3 に答える 3

5

このコードでは、興味深いことが起こっています。

;; test.lisp
(asdf:load-system :helloworld)

(defun main()
  (helloworld:start))

hellowworld:starthelloworld パッケージがまだないため、シンボルを読み取ろうとすることが問題であることに気付いたので、全体としてコンパイルすることはできません。シンボルを読み取るには、少なくともパッケージを定義する必要があります。しかし、なぜ同じ問題が発生しないの(asdf:load-system :helloworld)でしょうか? 簡単に言えば、ASDF パッケージは既に定義されています (実装に含まれているか、すでにロードされているか、またはその他の何かのいずれかです。その場合、できることの 1 つは、コンパイル時に helloworld システムが既にロードされていることを確認することです。 :

;; test.lisp
(eval-when (:compile-toplevel)
  (asdf:load-system :helloworld))

(defun main()
  (helloworld:start))

これでファイルをコンパイルできるはずです。コンパイル時に読み込みフォームを評価し、定義した時点でパッケージが定義されるためmainです。

もちろん、これでコンパイルされたファイルができましたが、helloworld システムがロードされていない Lisp の新しいインスタンスにそれをロードするとどうなるでしょうか? 問題が発生します。そのため、ファイルをロードするときにもそのシステムをロードする必要があり、ファイルからフォームを実行する場合 (たとえば、一度に 1 つずつフォームを読み込んで評価する場合) も同様です。したがって、おそらく、その負荷システムをさらに 2 つのコンテキストで評価する必要があります。

;; test.lisp
(eval-when (:compile-toplevel :load-toplevel :execute)
  (asdf:load-system :helloworld))

(defun main()
  (helloworld:start))

とはいえ、この場合、これがシステムをロードする最も適切な方法であるかどうかを必ず検討してください。なんらかの理由で、すべてのコードを 1 つのファイルに保持しようとしている場合や、配信スクリプトを作成している場合は、それが理にかなっています。一方、別の ASDF ロード可能システムを作成している場合は、依存関係として helloworld を含めて、ASDF に依存関係のロードを処理させます。

于 2014-09-10T11:45:21.333 に答える