> See below the compiler messages one gets when submitting your code to
> ACL 4.3.
> [...]
> Warning: While compiling these undefined functions were referenced:
> WR-UTILS::CLONE-ARRAY, WR-UTILS::WHITESPACE-P,
> WR-UTILS::WITH-OPEN-IB, WR-UTILS::F, WR-UTILS::WHILE,
> WR-UTILS::GET-WAITING-STREAM-STRING, WR-UTILS::EAT-WHITESPACE.
My apologies to everyone who tried running the code I posted - I
forgot to remove calls to utilities in other files, and I listed the
files in reverse order (fast-io should be loaded before parse-nums).
Below I enclose the missing utilities, which should be in an
additional file which is loaded first (it contains macros which call
macros).
Wheeler
--
Wheeler Ruml, Aiken 220, <eecs.harvard.edu, at ruml> (617) 496-1066 (fax)
http://www.das.harvard.edu/users/students/Wheeler_Ruml/Wheeler_Ruml.html
================
;; Utilities needed by fast-io and parse-nums.
;;
;; Wheeler Ruml <eecs.harvard.edu) at (ruml>
(defpackage "WR-UTILS"
(:nicknames "WR")
(:use common-lisp)
;; (:export ... add what you want ...)
)
(in-package wr-utils)
(deftype non-neg-fixnum ()
`(integer 0 ,most-positive-fixnum))
(deftype basic-vector (elt-type &optional (size '*))
`(simple-array ,elt-type (,size)))
;; from Graham's On Lisp book. useful for writing macros.
(defmacro with-gensyms (syms &body body)
"set the value of each symbol in SYMS to a unique gensym"
`(let ,(mapcar #'(lambda (s)
`(,s (gensym)))
syms)
<body)) at ,>
;; see also "loop while"
(defmacro while (test &body body)
"repeat BODY while TEST is true"
`(do ()
((not ,test))
<body)) at ,>
;; see also "loop for"
(defmacro for ((var start end &key (type 'non-neg-fixnum)) &body body)
"do BODY from VAR = START (inclusive) up to END (exclusive), taking care to evaluate END only once. Returns NIL."
(with-gensyms (end-val)
`(do ((,var ,start (1+ ,var))
(,end-val ,end))
((>= ,var ,end-val))
(declare (type ,type ,var ,end-val))
<body))) at ,>
(defun eat-chars (strm char-set)
(declare (type stream strm))
(loop
(let ((ch (read-char strm nil nil)))
(unless (member ch char-set)
(when ch
(unread-char ch strm))
(return)))))
(defconstant +whitespace+
'(#\Newline #\Space #\Tab #\Page #\Linefeed #\Return))
;;;;;;; SHOULD BE AN INLINE FUNCTION
;; (but even ACL 4.3 doesn't seem to have them!?)
(defun whitespace-p (ch)
(member ch +whitespace+ :test #'char=))
(defun eat-whitespace (strm)
(eat-chars strm +whitespace+))
(defun get-waiting-stream-string (output-stream
&optional (eof-error-p nil)
(eof-val nil))
"returns all waiting characters on the OUTPUT-STREAM and returns them as a string. If encounters EOF and EOF-ERROR-P is non-nil, returns EOF-VAL(defaults to NIL)."
(do ((output-string (make-array 128 :element-type 'character
:adjustable 't
:fill-pointer 0))
(new-ch (read-char-no-hang output-stream nil t)
(read-char-no-hang output-stream nil t)))
((null new-ch) output-string)
(if (eq new-ch t)
(if eof-error-p
(return eof-val)
(return output-string))
(vector-push-extend new-ch output-string 512))))
(defmacro do-vector ((var vec &key (start 0) (end nil)
(elt-type nil)
(key nil) (var-type elt-type)
(index (gensym)))
&body body)
"binds VAR to each element of VEC in turn. returns NIL."
(with-gensyms (the-vec)
`(let ((,the-vec ,vec))
,(when elt-type
`(declare (type (basic-vector ,elt-type) ,the-vec)))
(for (,index ,start ,(if end
end
`(the non-neg-fixnum (length ,the-vec))))
(let ((,var ,(if key
`(,key (aref ,the-vec ,index))
`(aref ,the-vec ,index))))
,(cond (var-type
`(declare (type ,var-type ,var)))
((and (null key) elt-type)
`(declare (type ,elt-type ,var))))
<body))))) at ,>
;; implemented as a macro to allow in-lining of arefs on certain types
(defmacro clone-array (src-seq new-len
&key (elt-type t) (copy-end nil))
"returns a new simple vector of NEW-LEN which has elements from SRC-SEQ
as its first COPY-END elements (default is length of SRC-SEQ)."
(with-gensyms (new-array el i)
`(let ((,new-array (make-array ,new-len :element-type ',elt-type)))
(declare (type (basic-vector ,elt-type) ,new-array))
(when ,src-seq
(do-vector (,el ,src-seq :end ,copy-end :index ,i
:elt-type ,elt-type)
(setf (aref ,new-array ,i) ,el)))
,new-array)))
;; EOF - utilities needed for fast-io and parse-nums