2010-11-26 11 views
6

ハスケルのmain関数は、私が望むだけで、ファイルがロードされたときに評価します(例えば、./myfile.hsまたはrunhaskell myfile.hs)。それ以外の場合は評価しません。 mainは、別のファイルによってファイルがインポートされたときには呼び出されません。 newLISPにもこの機能があります。Haskellのmain関数に相当するCommon Lisp?

Common Lispに相当するコードはありますか?

私はCLISPのsource codeを読んでいます。

  1. CLISPはp->argv_execute_fileとしてmyfile.lispを保存します。ここでは、ユーザがclisp myfile.lisp./myfile.lisp入ったときに何が起こるかです。
  2. CLISPは式(LOAD "p->argv_execute_file")を作成し、それをLispスタックにプッシュします。
  3. CLISPは、追加のコマンドライン引数をリストに保存します。
  4. CLISPは、引数をLisp変数*args*に格納します。

CLISPはp->argv_execute_fileを参照Lispの変数を作ることはありませんので、myfile.lispをREPLで、ユーザによって、または別のLispファイルによって、直接ロードされたかどうかを見分ける方法はありません。 (car *args*)myfile.lispの場合、私の仕事は簡単です。

注:ファイルがREPLからロードされている場合ShebangsはCLISPのトラブルを与えるので、私は~/.clisprc.lispにこのコードを配置:

(set-dispatch-macro-character #\# #\! 
(lambda (stream character n) 
    (declare (ignore character n)) 
    (read-line stream nil nil t) 
    nil)) 
+0

なぜメイン関数と同等のものが必要ですか? –

答えて

2

solutionが見つかりました。これはシェルトリッキーのビットですが、それは動作します。私はすぐにCLISP以外のCL実装で動作するようにこれを修正します。

#!/bin/sh 
#| 
exec clisp -q -q $0 $0 ${1+"[email protected]"} 
exit 
|# 

;;; Usage: ./scriptedmain.lisp 

(defun main (args) 
(format t "Hello World!~%") 
(quit)) 

;;; With help from Francois-Rene Rideau 
;;; http://tinyurl.com/cli-args 
(let ((args 
     #+clisp ext:*args* 
     #+sbcl sb-ext:*posix-argv* 
     #+clozure (ccl::command-line-arguments) 
     #+gcl si:*command-args* 
     #+ecl (loop for i from 0 below (si:argc) collect (si:argv i)) 
     #+cmu extensions:*command-line-strings* 
     #+allegro (sys:command-line-arguments) 
     #+lispworks sys:*line-arguments-list* 
    )) 

    (if (member (pathname-name *load-truename*) 
       args 
       :test #'(lambda (x y) (search x y :test #'equalp))) 
    (main args))) 
0

(eval-when (situation*) ...)

更新混乱の答えのために申し訳ありません。

私は間違っている可能性がありますが、正確にしたいことをするのは不可能なようです。私はシェルスクリプトを作成し、clisp -i myfile.lisp -x (main)を呼び出します。

実行可能にしない理由はありますか(here)。

P.S. Common Lispは言語であり、clispが実装の1つです。

+0

:ロードトップレベルは、コードのコンパイル中にのみ動作し、ファイルがロードされるたびにmainを呼び出します。 – mcandre

+0

@mcandre ':load-toplevel'は、ファイルが読み込まれたときに動作しますが、それ以外のものはすべて正しいです。私は答えを更新します。 – khachik

+0

clisp -i myscript.clはシバンとしてうまく機能しません。また、スクリプトをロードするときにclispは-x引数を使用できません。とにかくありがとう :) – mcandre

関連する問題