Rainer Joswig  <joswig@lisp.de> wrote:
+---------------
| Eric <ericbelcastro@gmail.com> wrote:
| > Because any number of ratios may be input, I am automatically creating
| > variables and assigning names to them.  I am doing it like this...
...
| > Also - are there simple ways of automatically creating incremented
| > variable names?  I tried intern on strings but that didn't work too
| > well, and settled on my current method.
| 
| (defparameter *my-symbol-counter* 0)
| (defun make-symbol-plus-counter (&optional (name "FOO")
|                                            (package *package*)
|                                            (counter '*my-symbol-counter*))
|   (prog1 (intern (concatenate 'string
|                               name
|                               (princ-to-string (symbol-value counter)))
|                  package)
|     (incf (symbol-value counter))))
+---------------
You showed him how to do it, but you forgot to tell him *NOT TO*!!  ;-}
That's right, Eric, *don't* do this. Instead, define yourself *one*
global variable that hold either an adjustable array or a hash table
(or some kind of tree structure, whatever) that can be grown dynamically
and be quickly indexed by your "counter" numbers, e.g.:
    > (defvar *lists* (make-array 20 :adjustable t :fill-pointer 0))
    *lists*
    > (defun add-new-list (list)
	(vector-push-extend list *lists*
			    ;; exponential growth [Fibonacci might be better]
			    (array-dimension *lists* 0)))
    ADD-NEW-LIST
    > (add-new-list '(a a b a))
    0
    > (add-new-list '(c d c d e e))
    1
    > (add-new-list '(f g h))
    2
    > (length *lists*)
    3
    > *lists*
    #((A A B A) (C D C D E E) (F G H))
    > (aref *lists* 1)                   ; fast access to any one
    (C D C D E E)
    > (map 'list #'length *lists*)       ; can use sequence functions
    (4 6 3)
    > (apply #'lcm *)
    12
    > 
That is, having inserted a number of lists of varying lengths,
it's rather simple to "mine" the data and find out, say, the
least common multiple of their lengths [which is sometimes
something you might want to know about a series of patterns].
Let's add 100 more lists, and see what happens:
    > (loop for i below 200 by 2 do
	(add-new-list (list i (1+ i)) ))
    NIL
    > (length *lists*)                  ; the "active" length (fill pointer)
    103
    > (array-dimension *lists* 0)       ; the total length
    160
    > (let ((*print-length* 8))
	(print *lists*)
	nil)
    #((A A B A) (C D C D E E) (F G H) (0 1) (2 3) (4 5) (6 7) (8 9) ...) 
    NIL
    > (aref *lists* 97)                 ; fast access to any one
    (188 189)
    >
The array has only been resized three times (doubling each time),
so the number of resizings per insertion can be made as small as
you like.
-Rob
-----
Rob Warnock			<rpw3@rpw3.org>
627 26th Avenue			<URL:http://rpw3.org/>
San Mateo, CA 94403		(650)572-2607