[Openmcl-devel] Using OpenMCL as a shell scripting interpreter
Frank Sonnemans
frank.sonnemans at unitekeapro.com
Wed Mar 31 08:06:41 PST 2004
I had a similar request to use openmcl for shell scripts several
months ago. The idea was to use something like:
openmcl scriptfile args
In which openmcl would call a main function like in C. Gary send me the
following code which I dumped into an image.
;---- file "filter-app.lisp"
(in-package "CCL") ; Too many of these things are internal symbols in CCL.
;;; A FILTER-APP inherits from APPLICATION, but not from
;;; LISP-DEVELOPMENT-SYSTEM.
(defclass filter-app (application) ())
;;; We'll handle the argument list by hand. It may not even be necessary
;;; to specialize this method, but it can't hurt.
(defmethod parse-application-arguments ((app filter-app))
(values nil nil nil))
;;; We don't have any sort of specialized init file.
(defmethod application-init-file ((app filter-app))
nil)
;;; All unhandled errors are fatal: we don't want to see a break loop.
(defmethod application-error ((app filter-app) cond frame)
(declare (ignore frame))
(format t "~&Fatal error: ~a~&" cond)
(force-output) ; ensure user sees the error
(quit -1))
;;; Define the application class's toplevel function.
(defmethod toplevel-function ((app filter-app) init-file)
(declare (ignore init-file))
;; The CAR of CCL::*COMMAND-LINE-ARGUMENT-LIST* is the
;; pathname of the kernel.
;; Assume that the CADR is the name of a loadable file
;; which defines CL-USER::MAIN. After loading the
;; file, try to call CL-USER::MAIN on the CDDR of the
;; argument-list.
(%set-toplevel nil)
(fmakunbound 'cl-user::main)
(load (cadr ccl::*command-line-argument-list*))
(apply #'cl-user::main (cddr ccl::*command-line-argument-list*)))
;---- end of filter-app.lisp
I call openmcl with the appropriate image using a script:
#!/bin/sh
openmcl -I ~/bin/filter-app.image "$@"
# end of script
And a simple test file:
(in-package "CL-USER")
(defun print-arguments (lst)
(when (consp lst)
(format t "~%~a" (car lst))
(print-arguments (rest lst))))
(defun main (&rest arguments)
(format t "Testing filter mode openmcl")
(print-arguments arguments)
(format t "~%All done~%~%")
(force-output))
Works very well.
Regards,
Frank
More information about the Openmcl-devel
mailing list