;;; 
;;; c:\program files\acl62\utility.cl 
;;; 
(load "c:\\program files\\acl62\\my-test.cl") 

(defun search-s1-in-s2 (s1 s2) 
  (let* ((n1 (length s1)) 
      (n2 (length s2)) 
      (lst (do ((i 0 (1+ i)) 
           (j n1 (1+ j)) 
           (w nil)) 
          ((= i n2) 
           (cond ((null w) nil) 
              (t (push n2 w) 
           (cond ((not (member 0 w)) 
              (append w '(0))) 
              (t w))))) 
       (cond ((and (equal s1 (subseq s2 i j)) 
           (cond ((null w) t) 
               (t (>= i (car w))))) 
            (push i w) 
            (push (+ i n1) w)))))) 
  ;;; 
  (do ((l lst (cdr l)) 
     (w)) 
    ((null (cdr l)) w) 
   (cond ((not (= (car l) (cadr l))) 
       (push (list (cadr l) (car l)) w)))))) 

(defun divide-s1-with-s2 (s1 s2) 
  (let ((lst (search-s1-in-s2 s2 s1))) 
    (do ((l lst (cdr l)) 
       (w)) 
      ((null l) (reverse w)) 
     (push (subseq s1 (caar l) (cadar l)) 
                w)))) 

(defun implode-aux (l) 
  (cond ((null l) "") 
     (t (concatenate 'string 
                     (car l) 
                     (implode-aux (cdr l)))))) 

(defun implode (l) (intern (implode-aux l))) 

;;; 
;;; (replace-s1-with-s2-in-s "a" "x" "abcabc") 
;;;       ===> "xbcxbc" 
;;; 
(defun replace-s1-with-s2-in-s (s1 s2 s) 
  (let ((lst (divide-s1-with-s2 s s1))) 
    (do ((l lst (cdr l)) 
       (w)) 
      ((null l) (implode-aux (reverse w)))
       (if (equal (car l) s1) 
       (push s2 w) 
        (push (car l) w))))) 

(defun display-a-list (l) 
  (do ((lst l (cdr lst)) 
     (i 1 (1+ i))) 
    ((null lst)) 
    (format t "~% ~a. ~a" i (car lst)))) 

(defun read-sentence () 
  (let ((input 
            (make-string-input-stream 
               (read-line)))) 
   (unwind-protect 
     (progn 
       (do ((word 
                      (read input nil) 
                      (read input nil)) 
          (sentence nil)) 
         ((not word) 
                   (return (reverse sentence))) 
        (push word sentence))) 
    (close input)))) 

(defun diskout-a-list (file-name lst) 
  (let ((stream 
             (open file-name :direction :output)))
   (print lst stream) 
   (close stream))) 

(defun diskin-a-list (file-name) 
  (with-open-file 
       (stream file-name :direction :input) 
   (do ((data 
          (read stream nil 'eof) 
          (read stream nil 'eof)) 
      (w nil)) 
     ((eq data 'eof) (reverse w)) 
     (push data w)))) 

(defun cut-head-of-list (l n) 
  (cond ((<= (length l) n) l) 
     ((= (length l) (1+ n)) 
      (rest l)) 
     (t 
            (cut-head-of-list (rest l) n))))

(defun generate-a-number-n1-n2 (n1 n2) 
  (prog (num) 
    loop 
    (setf num (random (* 6 n2))) 
    (if (and (>= num n1) (<= num n2)) 
      (return num) 
        (go loop)))) 

(defun remove-first-list-from-second-list (f s) 
  (cond ((null f) s) 
     ((member (first f) s :test #'equal) 
      (remove (first f) 
      (remove-first-list-from-second-list 
                (rest f)
                s) 
       :test #'equal)) 
     (t 
      (remove-first-list-from-second-list 
                 (rest f) s)))) 

(defun same-set-p (a b) 
  (and (null 
           (remove-first-list-from-second-list a b)) 
     (null (remove-first-list-from-second-list 
                    b a)))) 

(defun sub-set-p (a b) 
  (null (remove-first-list-from-second-list b a)))

(defun rotate-list (l &key direction (distance 2)) 
  (if (eq direction 'left) 
    (rotate-list-left l distance) 
   (rotate-list-right l distance))) 

(defun rotate-list-right (l n) 
  (if (zerop n) 
    l 
   (rotate-list-right 
          (append (last l) (butlast l)) (1- n)))) 

(defun rotate-list-left (l n) 
  (if (zerop n) 
    l 
   (rotate-list-left 
          (append (rest l) (list (first l))) (1- n))))

(defun get-position-of-an-element (e l) 
  (do ((lst l (cdr lst)) 
     (i 1 (1+ i))) 
    ((null lst) nil) 
   (cond ((equal e (car lst)) 
       (return i))))) 

(defun my-nth (n l) (nth (1- n) l)) 

(defun cut-list-at-length (n l) 
  (if (<= (length l) n) 
    l 
     (do ((lst l (cdr lst)) 
       (i 0 (1+ i)) 
       (w)) 
      ((= i n) (reverse w)) 
     (push (car lst) w)))) 

(setf *seed* 0) 

;(defun my-rand () 
;   (prog () 
;     (setf *seed* 
                (mod (+ (* 25173 *seed*) 13849) 
                     65536)) 
;     (return *seed*))) 

(defun my-rand () 
   (prog () 
     (setf *seed* 
                (mod (+ (* 7 *seed*) 4079) 
                     268435456)) 
     (return *seed*))) 

(defun my-random (n) (mod (my-rand) n)) 

(defun squash (s) 
   (cond ((null s) nil) 
      ((atom s) (list s)) 
      (t (append (squash (car s)) 
                       (squash (cdr s)))))) 

(defun get-numbers-from-a-list (l) 
   (do ((lst l (cdr lst)) 
      (w)) 
     ((null lst) (reserve w)) 
    (if (numberp (car lst)) 
            (push (car lst) w)))) 

(defun remove-duplicate (l) 
  (cond ((null l) nil) 
     ((member (car l) (cdr l) 
                   :test #'equal) 
      (cons (car l) (remove (car l) 
              (remove-duplicate (cdr l))
                                  :test #'equal))) 
     (t 
      (cons (car l) 
                  (remove-duplicate (cdr l)))))) 

(defun my-load (filename) 
   (let ((stream (open filename :direction :input))) 
     (do ((form nil (read stream nil stream))) 
       ((eq form stream) (close stream)) 
      (print (eval form))))) 

(defun make-frame-from-list (l) 
   (putprop (car l) l 'frame)) 

(defun display-frame (frame) 
  (let ((lst (fget-frame frame))) 
   (format t "~%On the frame ~a~%" (car lst)) 
   (mapcan #'(lambda (e) 
           (format t "~% ***** ~a *****~% ~a" 
                          (car e) (cdadr e))) 
     (rest lst))))