2012-01-03 8 views
3

私は2つの分離したファイルで、ファイルA.lispとB.lispと仮定しています。テスト用のコードとA.lispはB.lispの関数を呼び出します。つまり、A.lispで直接loadメソッドを使用すると、B.lispのメインコードが実行されますが、これは起こりそうではありません。そして、これらのファイルは、私の意見では、パッケージのようなものを使って考えるには小さすぎます。Common LispのPythonの `if __name__ ==" __main __ ":`のようなものはありますか

Common LispにPythonのif __name__ == "__main__":のようなものはありますか?この条件の中にラップされたトップレベルコードは、現在のファイルがメインモジュール、つまり実行中のプログラムである場合にのみ実行されますが、ライブラリとしてインポートされた場合は実行されません。

+0

私は[Clojureについての類似の質問](http://stackoverflow.com/questions/973106/what-is-the-clojure-equivalent-of-the-python-idiom-if-name-main) Common Lispではなく、いくつかの回答が参考になるかもしれません。 –

+0

ありがとう、ティム!本当に役に立ちます。 – lastland

答えて

6

パッケージはシンボルの名前空間です。彼らはコードのロードやコンパイルについて何も言わない。

Common Lispには、ライブラリ、モジュール、またはANSI Common Lisp標準の 'main'モジュール/ルーチンのようなものがないという考えはありません。この標準では、2つのルーチンPROVIDEREQUIREが定義されています。しかし、それらはあまりよく指定されていません。

ほとんどのアプリケーションとライブラリでは、コードを構造化、指定、コンパイル、ロードするために 'システム'ツールを使用しています。

ASDFと呼ばれる無料のものがあります。 「別のシステム定義機能」。ほとんどのタイプのアプリケーションでは、ASDFのようなツールが便利です。基本的なアプリケーションでは、COMPILE-FILELOADのような標準関数を使用して独自のツールを作成できます。

Nick LevineはASDF(彼の放棄したLispの書籍プロジェクトの一部)のチュートリアルを書いた:Systems

いくつかのLisp実装には、アプリケーションを作成するためのより広範な機能(例えば、Clozure Common Lispで書かれたMac OS Xアプリケーション)があります。

2

トップレベルフォームが評価されます。

は、次の例のように、main関数を定義することができ、そして、あなたが好きな、その関数を呼び出すことができます:

a.lisp

(defun main() 
    ...)

b.lisp:

+0

しかし、いくつかのテスト作業のためにA.lispを単独で実行したいのですが? – lastland

+0

a.lispとb.lispには必ずエントリポイントがあります。 – sbenitezb

+0

しかし、私はそれを単独で実行したい場合、A.lispでmain関数を実行することができなければなりません。メインの関数呼び出しがB.lispだけに存在する場合、どうすればいいですか? – lastland

1

私はPythonでどのように動作するのかわかりませんが、ファイルはのようですモジュール、2つのファイルは2つの異なるモジュールです。これは、 Common Lispのケースではありません。パッケージを定義していない場合は、loadファイルを使用すると、 すべての定義が現在のパッケージで利用可能になります(CL-USERはデフォルトの )。コードをREPLにペーストした場合はもっと似ています。

しかし、パッケージは本当に使いにくいものではありません。 A.lispで

:B.lispで

(defpackage foo 
    (:use #:cl) 
    (:export main)) 

(in-package :foo) 

(defun main() 
    (do-some-stuff) 
    (baz:main some-args)) 

(defpackage baz 
    (:use #:cl) 
    (:export main)) 

(in-package :baz) 

(defun main (some-args) 
    (do-some-stuff)) 

あなたは The Complete Idiot's Guide to Common Lisp PackagesPCL chapter on packagesを読むことができました。

4

イディオムはPythonに非常に特有であり、Pythonコミュニティの一部の人でも、それをテストコードの悪いスタイルとして使用することを検討しています。

REPLの対話型開発を重視するCommon Lispでは、テストを実行するたびにファイル全体をリロードする必要があります。テストをトップレベルではなく関数定義に入れるだけで、より効果的です。

+0

したがって、 '(load 'myfile)'ではなく 'clisp myfile.lisp'を使ってファイルを実行するときにのみ実行されるコードを書く方法はありませんか? – zstewart

+0

ファイルをスクリプトとして実行するときに評価されるコードを、スクリプトを評価するときにコマンドラインから呼び出す特別な関数に入れることができます。 CLISPではなくSBCLしかインストールされていないので、CLISPでこれを行う必要があるかどうかをテストすることはできません。SBCLで行うことができます。sbcl --noinform --load myfile.lisp --eval '(main)' --quit'はもちろん、コードがトップレベルにあるときにできる 'sbcl --script myfile.lisp'よりもかなり長いです。したがって、スクリプトをライブラリ部分をロードする余分なファイルにするほうが簡単です。 –

関連する問題