#! /bin/sh -e case $# in 0 | 1) echo >&2 "usage: $0 LISP SCRIPT [ARGS ...]"; exit 127 ;; esac lisp=$1 script=$2; shift 2 __CL_ARGV0=$script; export __CL_ARGV0 # this is stupid lispscript=$(printf "%s" "$script" | sed 's/[\"]/\\&/g') load_asdf_rune="\ (let ((*load-verbose* nil) #+cmu (ext:*require-verbose* nil)) (require \"asdf\"))" ignore_shebang_rune="\ (set-dispatch-macro-character #\# #\! (lambda (stream char arg) (declare (ignore char arg)) (values (read-line stream))))" clisp_startup_rune="\ (progn $ignore_shebang_rune $load_asdf_rune (setf *standard-input* (ext:make-stream :input)) (load \"$lispscript\" :verbose nil :print nil) (ext:quit))" abcl_startup_rune="\ (let ((script \"$lispscript\")) $load_asdf_rune $ignore_shebang_rune (setf *error-output* (java:jnew \"org.armedbear.lisp.Stream\" 'sys::system-stream (java:jfield \"java.lang.System\" \"err\") 'character java:+true+)) (handler-case (load script :verbose nil :print nil) (error (error) (format *error-output* \"~A (unhandled error): ~A~%\" script error) (ext:quit :status 255))))" #set -x case $lisp in sbcl) exec sbcl --noinform --eval "$load_asdf_rune" --script "$script" "$@" ;; ecl) exec ecl --norc --eval "$load_asdf_rune" --shell "$script" -- "$@" ;; clisp) exec clisp -norc -q -x "$clisp_startup_rune" -- "$@" ;; cmucl) exec cmucl -batch -noinit -nositeinit -quiet \ -eval "$load_asdf_rune" \ -eval "$ignore_shebang_rune" \ -load "$script" -eval "(ext:quit)" -- "$@" ;; ccl) exec ccl -b -n -Q \ -e "$load_asdf_rune" \ -e "$ignore_shebang_rune" \ -l "$script" -e "(ccl:quit)" -- "$@" ;; abcl) exec abcl --batch --noinform --noinit --nosystem \ --eval "$abcl_startup_rune" -- "$@" ;; *) echo >&2 "$0: unsupported Lisp \`$lisp'" exit 127 ;; esac