;;; Exercice 1 ;; 1- (defun make-number-table (vector) (let ((ht (make-hash-table :test #'equal))) (dotimes (i (length vector) ht) (setf (gethash (aref vector i) ht) i)))) ;; 2- (defun vector-from-table (table) (let ((vector (make-array (hash-table-count table)))) (maphash (lambda (k v) (setf (aref vector v) k)) table) vector)) ;;; Exercice 2 (defun to-vector (l1 l2) (let* ((len (min (length l1) (length l2))) (v (make-array len))) (dotimes (i len v) (setf (aref v i) (list (pop l1) (pop l2)))))) ;;; Exercice 3 ;; 1- (defun compress-vars (exp op) (let ((args (cdr exp))) (cons (car exp) (mapcar (lambda (symbol) (list op symbol (count symbol args :test #'eq))) (remove-duplicates args :test #'eq))))) ;; 2- (defun partition-args (args) (let ((numbers '()) (variables '()) (expressions '())) (dolist (arg args (values (nreverse numbers) (nreverse variables) (nreverse expressions))) (cond ((numberp arg) (push arg numbers)) ((atom arg) (push arg variables)) (t (push arg expressions))))))