7

Haskell のmain関数は、まさに私が望んでいることを実行します。ファイルが単独でロードされた場合 (./myfile.hsまたは などrunhaskell myfile.hs) を評価し、それ以外の場合は評価しません。mainファイルが別のファイルによってインポートされたときは呼び出されません。newLISPにもこの機能があります。

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

CLISPのソースコードを読みました。ユーザーがclisp myfile.lisporを入力すると、次のようになります./myfile.lisp

  1. CLISP は として保存myfile.lispp->argv_execute_fileます。
  2. CLISP は式(LOAD "p->argv_execute_file")を作成し、それを Lisp スタックにプッシュします。
  3. CLISP は、追加のコマンドライン引数をリストに保存します。
  4. CLISP は引数を Lisp 変数に格納します*args*

CLISP は を参照する Lisp 変数を作成しp->argv_execute_fileないため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))
4

2 に答える 2

2

私は解決策を見つけました。ちょっとしたシェルトリックですが、うまくいきます。CLISP 以外の CL 実装で動作するように、すぐにこれを変更します。

#!/bin/sh
#|
exec clisp -q -q $0 $0 ${1+"$@"}
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)))
于 2010-11-29T00:50:47.747 に答える
0

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

紛らわしい答えを更新して申し訳ありません。

私は間違っているかもしれませんが、あなたが望むことを正確に行うことは不可能のようです. シェル スクリプトを作成してclisp -i myfile.lisp -x (main).

実行可能にしない理由はありますか (ここで説明します)?

PS Common Lisp は言語でclispあり、実装の 1 つです。

于 2010-11-26T14:09:12.610 に答える