Create a variable name from a string in Lisp

邮差的信 提交于 2019-11-30 23:09:13

问题


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:

  1. SETF does not evaluate its first argument. It expects a symbol or a form that specifies a location to update. Use SET instead.

  2. Depending upon the vintage and settings of your Common Lisp implementation, symbol names may default to upper case. Thus, the second reference to foo may actually refer to a symbol whose name is "FOO". In this case, you would need to use (intern "FOO").

  3. The call to STRING is 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!