www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit d10e571953adc1606884b639168372603a5a0d4d
parent b63aa7c261c795d4861de94f9a306fb0f5abae59
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date:   Sun,  7 Nov 2010 05:46:06 +0100

Ajout de copy-all.

Diffstat:
Mtest-unitaire.lisp | 24+++++++++++++++++++-----
Mutil.lisp | 33++++++++++++++++++++++++++++++---
2 files changed, 49 insertions(+), 8 deletions(-)

diff --git a/test-unitaire.lisp b/test-unitaire.lisp @@ -86,11 +86,8 @@ ,expected)) (defmacro deftestvar (module name value) - (if (arrayp value) - `(test-add-variable ',module - (list ',name (list 'copy-seq ',value))) - `(test-add-variable ',module - (list ',name (list 'copy-tree ',value))))) + `(test-add-variable ',module + (list ',name (list 'copy-all ',value)))) (defvar run-tests-counter 0) @@ -133,6 +130,23 @@ (unless (listp module) (setq module (list module))) `(test-remove-module ',module)) +(erase-tests test-unitaire) +(deftest (test-unitaire copy-all) + (let ((foo #(a b (1 #(2 4 6) 3) c)) + (copy-of-foo (copy-all foo))) + copy-of-foo + (setf (aref (cadr (aref copy-of-foo 2)) 1) (cons 'MODIFIED (random 42))) + (equalp foo #(a b (1 #(2 4 6) 3) c))) + t #'booleq) + +(deftest (test-unitaire copy-all) + (let ((foo #(a x (1 #(2 4 7) 5) c)) + (copy-of-foo (copy-all foo))) + copy-of-foo + (setf (aref (cadr (aref foo 2)) 1) (cons 'MODIFIED (random 42))) + (equalp foo #(a x (1 #(2 4 7) 5) c))) + nil #'booleq) + ;;; Exemples d'utilisation. ;; (erase-tests (a sub-1)) diff --git a/util.lisp b/util.lisp @@ -1,4 +1,3 @@ - ;; Fonctions utiles ;; Liste de quelques fonctions pratiques de LISP : ;; (rplacd x val) = (setf (cdr x) val) @@ -42,8 +41,8 @@ (defun range (a &optional b) (cond ((null b) (range 0 a)) - ((> a b) (loop for i from a above (- b 1) collect i)) - (T (loop for i from a to b collect i)))) + ((> a b) (loop for i from a above b collect i)) + (T (loop for i from a below b collect i)))) (defun shift (n l) (if (<= n 0) @@ -99,3 +98,31 @@ (T (mposition-t symb (cdr list) (+ 1 counter))))) (mposition-t symb list 0)) + +;; TODO : ne copie pas les listes de propriétés des symboles. +;; Vu que ce n'est techniquement pas réalisable, il faut en tenir +;; compte dans les tests unitaires etc. +(defun copy-all (data) + "Copie récursivement un arbre de listes et de tableaux." + (print data) + (cond + ((consp data) + (cons (copy-all (car data)) + (copy-all (cdr data)))) + ((arrayp data) + (let ((res (make-array (array-dimensions data)))) + (dotimes (i (array-total-size data)) + (setf (row-major-aref res i) (copy-all (row-major-aref data i)))) + res)) + ((stringp data) + (copy-seq data)) + ((null data) + nil) + ((symbolp data) + data) + ((numberp data) + data) + ((characterp data) + data) + (t + (warn "copy-all : Je ne sais pas copier ~w" data))))