- (setf (node-up node) parent)
- (loop
- (unless parent (return))
- (incf nlen)
- (let ((plen (node-len parent)))
- ;;(format t ";; node `~A' ~D parent `~A' ~D~%"
- ;; (node-word node) (1- nlen)
- ;; (node-word parent) plen)
- (cond ((> plen nlen)
- ;;(format t ";; longer chain through `~A'~%"
- ;; (node-word (node-down parent)))
- (return))
- ((= plen nlen)
- (setf (node-right node) (node-down parent)
- (node-down parent) node)
- (return))
- (t
- ;;(format t ";; new longest chain ~A > ~A~%"
- ;; nlen plen)
- (setf (node-down parent) node
- (node-right node) nil
- (node-len parent) nlen
- node parent
- parent (node-up node))))))
- (when (> nlen max) (setf max nlen))))
+ (when parent
+ (setf (node-up node) parent)
+ (loop
+ (unless parent
+ (when (>= nlen max)
+ (when (> nlen max)
+ (setf max nlen
+ winners nil))
+ (push node winners))
+ (return))
+ (incf nlen)
+ (let ((plen (node-len parent)))
+ ;;(format t ";; node `~A' ~D parent `~A' ~D~%"
+ ;; (node-word node) (1- nlen)
+ ;; (node-word parent) plen)
+ (cond ((> plen nlen)
+ ;;(format t ";; longer chain through `~A'~%"
+ ;; (node-word (node-down parent)))
+ (return))
+ ((= plen nlen)
+ (setf (node-right node) (node-down parent)
+ (node-down parent) node)
+ (return))
+ (t
+ ;;(format t ";; new longest chain ~A > ~A~%"
+ ;; nlen plen)
+ (setf (node-down parent) node
+ (node-right node) nil
+ (node-len parent) nlen
+ node parent
+ parent (node-up node)))))))))