Update of /project/mcclim/cvsroot/mcclim/Drei/cl-automaton In directory clnet:/tmp/cvs-serv24917/Drei/cl-automaton
Modified Files: automaton.lisp eqv-hash.lisp state-and-transition.lisp Log Message: Make cl-automaton (the regexp part of Drei) work in CLISP. This was done by fixing non-conformant loops that SBCL happens to handle.
--- /project/mcclim/cvsroot/mcclim/Drei/cl-automaton/automaton.lisp 2006/11/08 01:15:32 1.1 +++ /project/mcclim/cvsroot/mcclim/Drei/cl-automaton/automaton.lisp 2007/01/14 17:33:51 1.2 @@ -83,20 +83,21 @@ (worklist nil)) (setf (gethash (initial a) visited) t) (push (initial a) worklist) - (loop while worklist - for s = (pop worklist) do - (with-ht (tr nil) (transitions s) - (let ((s2 (to tr))) - (unless (gethash s2 visited) - (setf (gethash s2 visited) t) - (push s2 worklist))))) + (loop for s = (first worklist) + while worklist do + (pop worklist) + (with-ht (tr nil) (transitions s) + (let ((s2 (to tr))) + (unless (gethash s2 visited) + (setf (gethash s2 visited) t) + (push s2 worklist))))) visited))
(defun accepting-states (a) "Returns a hash table containing the set of accepting states reachable from the initial state of A." (let ((accepting (make-hash-table))) - (loop for s being the hash-key of (states a) + (loop for s being the hash-keys of (states a) when (accept s) do (setf (gethash s accepting) t)) accepting)) @@ -106,7 +107,7 @@ states being the keys of STATES hash table, and finally returns STATES." (let ((i -1)) - (loop for s being the hash-key of states do + (loop for s being the hash-keys of states do (setf (num s) (incf i)))) states)
@@ -117,7 +118,7 @@ (tr (make-instance 'transition :minc +min-char-code+ :maxc +max-char-code+ :to s))) (htadd (transitions s) tr) - (loop for p being the hash-key of (states a) + (loop for p being the hash-keys of (states a) and maxi = +min-char-code+ do (loop for tr in (sorted-transition-list p nil) do (with-slots (minc maxc) tr @@ -140,7 +141,7 @@ a (let ((states (states a))) (set-state-nums states) - (loop for s being the hash-key of states do + (loop for s being the hash-keys of states do (let ((st (sorted-transition-list s t))) (reset-transitions s) (let ((p nil) @@ -179,7 +180,7 @@ "Returns a sorted vector of all interval start points (character codes)." (let ((pset (make-hash-table))) - (loop for s being the hash-key of (states a) do + (loop for s being the hash-keys of (states a) do (setf (gethash +min-char-code+ pset) t) (with-ht (tr nil) (transitions s) (with-slots (minc maxc) tr @@ -188,7 +189,7 @@ (setf (gethash (1+ maxc) pset) t))))) (let ((pa (make-array (hash-table-count pset) :element-type 'char-code-type))) - (loop for p being the hash-key of pset and n from 0 do + (loop for p being the hash-keys of pset and n from 0 do (setf (aref pa n) p) finally (return (sort pa #'<))))))
@@ -196,19 +197,20 @@ "Returns the set of live states of A that are in STATES hash table. A state is live if an accepting state is reachable from it." (let ((map (make-hash-table))) - (loop for s being the hash-key of states do + (loop for s being the hash-keys of states do (setf (gethash s map) (make-hash-table))) - (loop for s being the hash-key of states do + (loop for s being the hash-keys of states do (with-ht (tr nil) (transitions s) (setf (gethash s (gethash (to tr) map)) t))) (let* ((live (accepting-states a)) - (worklist (loop for s being the hash-key of live collect s))) - (loop while worklist - for s = (pop worklist) do - (loop for p being the hash-key of (gethash s map) - unless (gethash p live) do - (setf (gethash p live) t) - (push p worklist))) + (worklist (loop for s being the hash-keys of live collect s))) + (loop for s = (first worklist) + while worklist do + (pop worklist) + (loop for p being the hash-keys of (gethash s map) + unless (gethash p live) do + (setf (gethash p live) t) + (push p worklist))) live)))
(defun remove-dead-transitions (a) @@ -218,7 +220,7 @@ nil (let* ((states (states a)) (live (live-states2 a states))) - (loop for s being the hash-key of states do + (loop for s being the hash-keys of states do (let ((st (transitions s))) (reset-transitions s) (with-ht (tr nil) st @@ -232,7 +234,7 @@ slot." (set-state-nums states) (let ((transitions (make-array (hash-table-count states)))) - (loop for s being the hash-key of states do + (loop for s being the hash-keys of states do (setf (aref transitions (num s)) (sorted-transition-vector s nil))) transitions))
@@ -466,7 +468,7 @@ (progn (setf a1 (clone-expanded a1) a2 (clone-expanded a2)) - (loop for s being the hash-key of (accepting-states a1) do + (loop for s being the hash-keys of (accepting-states a1) do (setf (accept s) nil) (add-epsilon s (initial a2))) (setf (deterministic a1) nil) @@ -482,7 +484,7 @@ (loop for a2 in (cdr l) do (let* ((a2 (clone-expanded a2)) (ac2 (accepting-states a2))) - (loop for s being the hash-key of ac1 do + (loop for s being the hash-keys of ac1 do (setf (accept s) nil) (add-epsilon s (initial a2)) (when (accept s) @@ -511,7 +513,7 @@ (s (make-instance 'state))) (setf (accept s) t) (add-epsilon s (initial a)) - (loop for p being the hash-key of (accepting-states a) do + (loop for p being the hash-keys of (accepting-states a) do (add-epsilon p s)) (setf (initial a) s (deterministic a) nil) @@ -546,10 +548,10 @@ (let ((a3 (clone a))) (loop while (> (decf max) 0) do (let ((a4 (clone a))) - (loop for p being the hash-key of (accepting-states a4) do + (loop for p being the hash-keys of (accepting-states a4) do (add-epsilon p (initial a3))) (setq a3 a4))) - (loop for p being the hash-key of (accepting-states a2) do + (loop for p being the hash-keys of (accepting-states a2) do (add-epsilon p (initial a3))) (setf (deterministic a2) nil) (check-minimize-always a2)))) @@ -559,7 +561,7 @@ (let ((a (clone-expanded a))) (determinize a) (totalize a) - (loop for p being the hash-key of (states a) do + (loop for p being the hash-keys of (states a) do (setf (accept p) (not (accept p)))) (remove-dead-transitions a) (check-minimize-always a))) @@ -673,7 +675,7 @@ (loop while worklist do (let* ((s (pop worklist)) (r (htref newstate s))) - (loop for q being the hash-key of (ht s) + (loop for q being the hash-keys of (ht s) when (accept q) do (setf (accept r) t) (return)) @@ -681,7 +683,7 @@ for c across points and n from 0 do (let ((p (make-instance 'state-set))) - (loop for q being the hash-key of (ht s) do + (loop for q being the hash-keys of (ht s) do (with-ht (tr nil) (transitions q) (when (<= (minc tr) c (maxc tr)) (setf (gethash (to tr) (ht p)) t)))) @@ -763,7 +765,7 @@ (defun mark-pair (mark triggers n1 n2) (setf (aref mark n1 n2) t) (when (aref triggers n1 n2) - (loop for p being the hash-key of (aref triggers n1 n2) do + (loop for p being the hash-keys of (aref triggers n1 n2) do (let ((m1 (n1 p)) (m2 (n2 p))) (when (> m1 m2) @@ -773,7 +775,7 @@
(defun ht-set-to-vector (ht) (loop with vec = (make-array (hash-table-count ht)) - for k being the hash-key of ht + for k being the hash-keys of ht and i from 0 do (setf (aref vec i) k) finally (return vec))) @@ -900,9 +902,10 @@ (let ((j (if (<= i0 i1) 0 1))) (push (make-instance 'int-pair :n1 j :n2 i) pending) (setf (aref pending2 i j) t))) - (loop while pending - for ip = (pop pending) - for p = (n1 ip) and i = (n2 ip) do + (loop for ip = (first pending) + for p = (when pending (n1 ip)) and i = (when pending (n2 ip)) + while pending do + (pop pending) (setf (aref pending2 i p) nil) (loop for m = (fst (aref active p i)) then (succ m) while m do @@ -970,20 +973,20 @@ (let ((m (make-hash-table)) (states (states a)) (astates (accepting-states a))) - (loop for r being the hash-key of states do + (loop for r being the hash-keys of states do (setf (gethash r m) (make-generalized-hash-table +equalp-key-situation+) (accept r) nil)) - (loop for r being the hash-key of states do + (loop for r being the hash-keys of states do (with-ht (tr nil) (transitions r) (htadd (gethash (to tr) m) (make-instance 'transition :minc (minc tr) :maxc (maxc tr) :to r)))) - (loop for r being the hash-key of states do + (loop for r being the hash-keys of states do (setf (transitions r) (gethash r m))) (setf (accept (initial a)) t (initial a) (make-instance 'state)) - (loop for r being the hash-key of astates do + (loop for r being the hash-keys of astates do (add-epsilon (initial a) r)) (setf (deterministic a) nil) astates)) @@ -1011,13 +1014,14 @@ (let ((worklist pairs) (workset (make-generalized-hash-table +equalp-key-situation+))) (loop for p in pairs do (htadd workset p)) - (loop while worklist - for p = (pop worklist) do + (loop for p = (first worklist) + while worklist do + (pop worklist) (htremove workset p) (let ((tos (gethash (s2 p) forward)) (froms (gethash (s1 p) back))) (when tos - (loop for s being the hash-key of tos + (loop for s being the hash-keys of tos for pp = (make-instance 'state-pair :s1 (s1 p) :s2 s) unless (member pp pairs :test #'(lambda (o1 o2) @@ -1029,7 +1033,7 @@ (push pp worklist) (htadd workset pp) (when froms - (loop for q being the hash-key of froms + (loop for q being the hash-keys of froms for qq = (make-instance 'state-pair :s1 q :s2 (s1 p)) unless (htpresent workset qq) do (push qq worklist) @@ -1113,7 +1117,7 @@ "Returns the number of transitions of A." (if (singleton a) (length (singleton a)) - (loop for s being the hash-key of (states a) + (loop for s being the hash-keys of (states a) sum (cnt (transitions s)))))
(defun empty-p (a) @@ -1152,7 +1156,7 @@ (set-state-nums states)) (format s "~@<initial state: ~A ~_~@<~{~W~^ ~_~}~:>~:>" (num (initial a)) - (loop for st being the hash-key of states collect st))) + (loop for st being the hash-keys of states collect st))) a)
(defun clone-expanded (a) @@ -1173,9 +1177,9 @@ (setf (singleton a2) (singleton a)) (let ((map (make-hash-table)) (states (states a))) - (loop for s being the hash-key of states do + (loop for s being the hash-keys of states do (setf (gethash s map) (make-instance 'state))) - (loop for s being the hash-key of states do + (loop for s being the hash-keys of states do (let ((p (gethash s map))) (setf (accept p) (accept s)) (when (eq s (initial a)) --- /project/mcclim/cvsroot/mcclim/Drei/cl-automaton/eqv-hash.lisp 2006/11/08 01:15:32 1.1 +++ /project/mcclim/cvsroot/mcclim/Drei/cl-automaton/eqv-hash.lisp 2007/01/14 17:33:51 1.2 @@ -100,13 +100,13 @@
(defmacro with-ht ((key value) table &body body) (let ((bucket (gensym "BUCKET"))) - `(loop for ,bucket being the hash-value of (ht ,table) do + `(loop for ,bucket being the hash-values of (ht ,table) do (loop for (,key . ,value) in ,bucket do ,@body))))
(defmacro with-ht-collect ((key value) table &body body) (let ((bucket (gensym "BUCKET"))) - `(loop for ,bucket being the hash-value of (ht ,table) nconc + `(loop for ,bucket being the hash-values of (ht ,table) nconc (loop for (,key . ,value) in ,bucket collect ,@body))))
--- /project/mcclim/cvsroot/mcclim/Drei/cl-automaton/state-and-transition.lisp 2006/11/08 01:15:32 1.1 +++ /project/mcclim/cvsroot/mcclim/Drei/cl-automaton/state-and-transition.lisp 2007/01/14 17:33:51 1.2 @@ -110,13 +110,13 @@ "Returns true if state-set objects SS1 and SS2 contain the same (eql) state objects." (and (= (hash-table-count (ht ss1)) (hash-table-count (ht ss2))) - (loop for st being the hash-key of (ht ss1) + (loop for st being the hash-keys of (ht ss1) always (gethash st (ht ss2)))))
(defmethod hash ((ss state-set) (s (eql +equalp-key-situation+))) "Returns the hash code for state-set SS." (the fixnum - (mod (loop for st being the hash-key of (ht ss) + (mod (loop for st being the hash-keys of (ht ss) sum (sxhash st)) most-positive-fixnum)))