* (defun my-getenv (name &optional default) #+CMU (let ((x (assoc name ext:*environment-list* :test #'string=))) (if x (cdr x) default)) #-CMU (or #+Allegro (sys:getenv name) #+CLISP (ext:getenv name) #+ECL (si:getenv name) #+SBCL (sb-unix::posix-getenv name) #+LISPWORKS (lispworks:environment-variable name) default)) MY-GETENV * (my-getenv "HOME") "/home/edi" * (my-getenv "HOM") NIL * (my-getenv "HOM" "huh?") "huh?"You should also note that some of these implementations also provide the ability to set these variables. These include ECL (
SI:SETENV
) and AllegroCL, LispWorks, and CLISP where
you can use the functions from above together with
SETF
.
This feature might be important if you want to start subprocesses from
your Lisp environment.
*posix-argv*
$ sbcl my-command-line-arg
....
* *posix-argv* ("sbcl" "my-command-line-arg") *More on using this to write standalone Lisp scripts can be found in the SBCL Manual LispWorks has
system:*line-arguments-list*
CL-USER> system:*line-arguments-list* ("/Users/cbrown/Projects/lisptty/tty-lispworks" "-init" "/Users/cbrown/Desktop/lisp/lispworks-init.lisp")CMUCL has interesting extensions for manipulating the arguments Here's a quick function to return the argument strings list across multiple implementations:
(defun my-command-line () (or #+SBCL *posix-argv* #+LISPWORKS system:*line-arguments-list* #+CMU extensions:*command-line-words* nil))
fork
system call with this CL implementation.
(defparameter *sigchld* 0) (defparameter *compile-files-debug* 2) (defun sigchld-handler (p1 p2 p3) (when (> 0 *compile-files-debug*) (print (list "returned" p1 p2 p3)) (force-output)) (decf *sigchld*)) (defun compile-files (files &key (load nil)) (setq *sigchld* 0) (system:enable-interrupt unix:sigchld #'sigchld-handler) (do ((f files (cdr f))) ((not f)) (format t "~&process ~d diving for ~a" (unix:unix-getpid) `(compile-file ,(car f))) (force-output) (let ((pid (unix:unix-fork))) (if (/= 0 pid) ;; parent (incf *sigchld*) ;; child (progn (compile-file (car f) :verbose nil :print nil) (unix:unix-exit 0))))) (do () ((= 0 *sigchld*)) (sleep 1) (when (> 0 *compile-files-debug*) (format t "~&process ~d still waiting for ~d childs" (unix:unix-getpid) *sigchld*))) (when (> 0 *compile-files-debug*) (format t "~&finished")) (when load (do ((f files (cdr f))) ((not f)) (load (compile-file-pathname (car f))))))