Is there a function in Common Lisp that takes a string as an argument and returns a keyword?
Example: (keyword "foo")
-> :foo
Is there a function in Common Lisp that takes a string as an argument and returns a keyword?
Example: (keyword "foo")
-> :foo
Here's a make-keyword
function which packages up keyword creation process (intern
ing of a name into the KEYWORD
package). :-)
(defun make-keyword (name) (values (intern name "KEYWORD")))
(symbol-value (intern "FOO" "KEYWORD"))
already has the correct value. Besides, Alexandria implements it using the same approach also. –
Larimore The answers given while being roughly correct do not produce a correct solution to the question's example.
Consider:
CL-USER(4): (intern "foo" :keyword)
:|foo|
NIL
CL-USER(5): (eq * :foo)
NIL
Usually you want to apply STRING-UPCASE to the string before interning it, thus:
(defun make-keyword (name) (values (intern (string-upcase name) "KEYWORD")))
:downcase
… –
Telesis Here's a make-keyword
function which packages up keyword creation process (intern
ing of a name into the KEYWORD
package). :-)
(defun make-keyword (name) (values (intern name "KEYWORD")))
(symbol-value (intern "FOO" "KEYWORD"))
already has the correct value. Besides, Alexandria implements it using the same approach also. –
Larimore There is a make-keyword
function in the Alexandria library, although it does preserve case so to get exactly what you want you'll have to upcase the string first.
print-case
to :downcase
. intern
doesn't do any case modification, so the solution here probably shouldn't either. (Although the example in the question does say (keyword "foo") => :foo
, it's probably better to have (... "foo") => :|foo|
or (... "FOO") => :FOO
.) –
Telesis In case, you can change the string to start with colon sign :
use read-from-string
directly.
Here is another version of make-keyword
:
(defun make-keyword (name)
(read-from-string (concatenate 'string ":" name)))
(read-from-string (concatenate 'string ":" name))
? –
Gosplan In this example it also deals with strings with spaces (replacing them by dots):
(defun make-keyword (name) (values (intern (substitute #\. #\space (string-upcase name)) :keyword)))
"foo bar"
you get a symbol with the name "foo bar"
, and there's no problem with that. intern
doesn't replace spaces with dots, either. –
Telesis (intern "foo" "KEYWORD") -> :foo
See the Strings section of the Common Lisp Cookbook for other string/symbol conversions and a detailed discussion of symbols and packages.
© 2022 - 2024 — McMap. All rights reserved.