Subject: Re: Concatenating strings in Allegro CL
From: rpw3@rigden.engr.sgi.com (Rob Warnock)
Date: 1999/07/11
Newsgroups: comp.lang.lisp
Message-ID: <7m9qd2$8ad6d@fido.engr.sgi.com>
[Disclaimer: I'm more fluent in Scheme than CL, so excuse me if I don't
say this exactly right...]

Noam Elbaum  <noam@ic.co.il> wrote:
+---------------
| I need to concatenate two strings (add two string to form one string ) in
| order to use them as a function name.
|
| meaning :
| i have two functions named: global-a, global-b
| and i want to call one of them according to variable named c which have the
| values of 'a or 'b.
| 
| I want to do:
| (funcall (concatinate 'global- c ))
+---------------

Personally, I wouldn't do it that way at all!  Try something like this
instead [note: I'm deliberately not using quasiquotes, since you said
you're a newbie]:

	(defvar *global-funcs*
	  (list
	    (cons 'a #'global-a)
	    (cons 'b #'global-b)
	    ...any others...
	    ))

	(defun callit (arg)
	  (let ((elem (assoc arg *global-funcs*)))
	    (if elem
	      (funcall (cdr elem))
	      ...handle the error...)))

Then (callit 'a) would call the function "global-a", and so on.

Also, this way the keys & function names are *not* required to be
related in any way (though they still *may* be, if you like). That is,
if "*global-funcs*" contains "(cons 'foo #'bar)", then (callit 'foo)
will call "bar", not "global-foo".


-Rob

p.s. Later, if the "*global-funcs*" list gets too long [whatever
"too long" might mean, in your particular application], you might
consider changing it to a hash table, and changing "callit" accordingly.
None of the code that uses "callit" would need to change, though.

-----
Rob Warnock, 8L-855		rpw3@sgi.com
Applied Networking		http://reality.sgi.com/rpw3/
Silicon Graphics, Inc.		Phone: 650-933-1673
1600 Amphitheatre Pkwy.		FAX: 650-933-0511
Mountain View, CA  94043	PP-ASEL-IA