;;; -*- Mode:LISP; Readtable:CL; Base:10 -*-
(defun p2a(arr &optional (print-spec "~s") (stream *standard-output*))
  (check-type arr array)
  (let((dims (array-dimensions arr)))
    (when (neq dims 2)
      (let((rows (car dims))
	   (cols (cadr dims)))
	(loop for i from 0 to (1- rows)
	      do (format stream "~&~3d: " i)
	      (loop for j from 0 to (1- cols)
		    do
		    (format stream " ")
		    (format stream print-spec (aref arr i j))))))))


(defmacro with-output-file (stream filename &body body)
  `(with-open-file (,stream ,filename :direction :output)
     ,body))



(defun foo ()
  (let((a 1))
    (declare(special a))
     (foo2)))

(defun foo2()
  (declare(special a))
  (print a))


(defflavor ship
	 ((mass 0.0)
	  (velocity 0.0)
	  (name "my ship"))
	 nil
  :gettable-instance-variables
  :settable-instance-variables
  (:special-instance-variables mass velocity))

(defmethod (ship :pring) ()
  (labels((print-mass (string)
		      (declare(special mass))
		      (format t "~&~a ~s" string mass))
	  (print-velocity (string)
			  (declare(special mass velocity))
			  (unless (zerop mass)
			    (format t "~&~a ~s" string velocity)
			    (print-mass "The mass is"))))
  (print-mass "My mass is")
  (print-velocity "My velocity is")))

(defun pringle()
  (declare(special mass))
  (format t "My mass is ~s" mass))
