问题
I'm trying to take a string, and convert it into a variable name. I though (make-symbol) or (intern) would do this, but apparently it's not quite what I want, or I'm using it incorrectly.
For example:
> (setf (intern (string "foo")) 5)
> foo
5
Here I would be trying to create a variable named 'foo' with a value of 5. Except, the above code gives me an error. What is the command I'm looking for?
回答1:
There are a number of things to consider here:
SETFdoes not evaluate its first argument. It expects a symbol or a form that specifies a location to update. UseSETinstead.Depending upon the vintage and settings of your Common Lisp implementation, symbol names may default to upper case. Thus, the second reference to
foomay actually refer to a symbol whose name is"FOO". In this case, you would need to use(intern "FOO").The call to
STRINGis harmless but unnecessary if the value is already a string.
Putting it all together, try this:
> (set (intern "FOO") 5)
> foo
5
回答2:
Use:
CL-USER 7 > (setf (SYMBOL-VALUE (INTERN "FOO")) 5)
5
CL-USER 8 > foo
5
This also works with a variable:
CL-USER 11 > (let ((sym-name "FOO"))
(setf (SYMBOL-VALUE (INTERN sym-name)) 3))
3
CL-USER 12 > foo
3
Remember also that by default symbols are created internally as uppercase. If you want to access a symbol via a string, you have to use an uppercase string then.
来源:https://stackoverflow.com/questions/5306818/create-a-variable-name-from-a-string-in-lisp