List 如何在common lisp中将字符转换为符号?

List 如何在common lisp中将字符转换为符号?,list,lisp,common-lisp,List,Lisp,Common Lisp,完全lisp初学者在这里 我想知道如何把一个字符转换成符号。我只想把\a转换成a 以下是我迄今为止所做的工作: (defun convert(char) (if(eq char #\a) (setq char 'a)) char) 这一个实际上是可行的,但我不想添加26个条件(字母表中的字母)并生成一个长而愚蠢的代码 另外,我想知道在common lisp中是否有任何函数可以将字符列表转换为符号列表,如:(\h\e\l\l\l\o)转换为(HE l o)?我发现intern和m

完全lisp初学者在这里

我想知道如何把一个字符转换成符号。我只想把
\a
转换成
a

以下是我迄今为止所做的工作:

(defun convert(char)
(if(eq char #\a)
    (setq char 'a))
    char)
这一个实际上是可行的,但我不想添加26个条件(字母表中的字母)并生成一个长而愚蠢的代码

另外,我想知道在common lisp中是否有任何函数可以将字符列表转换为符号列表,如:
(\h\e\l\l\l\o)
转换为
(HE l o)
?我发现
intern
makesymbol
与此相关,但它们需要字符串作为参数

CL-USER 230 > (intern (string #\Q))
Q
NIL

CL-USER 231 > (intern (string #\q))
\q
NIL
顺便说一句,您的代码有一系列必要的改进:

(defun convert(char)   ; 
(if(eq char #\a)       ; use EQL instead of EQ for characters
                       ; indentation is wrong
    (setq char 'a))    ; indentation is wrong
    char)              ; indentation is wrong
最好写为:

(defun convert (char)
  (if (eql char #\a)
      'a
      char))

如上所述,“真正”的解决方案是:

(defun convert (char)
  (intern (string char)))
可以使用“生成符号”并将符号转换为字符串

(setq my-sym (converter #\a))

过了一会儿,我回答了自己的问题:

另外,我想知道在公共lisp中是否有任何函数可以将字符列表转换为符号列表,如:(#\h#\e#\l#\l#\o)到(HE l o)

我可以使用此转换功能将单个字符转换为符号:

(defun convert (c)
    (if (characterp c)
        (intern (string c))))
由于LISP的主要思想之一是“处理列表”,我可以使用一个映射函数将一个操作应用于列表的每个元素

(mapcar #'convert '(#\h #\e #\l #\l #\o))
此处
mapcar
函数将生成符号列表:

(|h| |e| |l| |l| |o|)

在你的环境中,你在q之前得到“\”,我在我的环境中得到“|”符号。请问这些是什么?我为
(intern(string#\q))
获得了
|q |
,它们是转义字符,以确保符号可以保留符号名称中的小写字符。@sushibossftw:注意
|a |
\a
的符号相同:`(eq'| a |'\a)`是真的。反斜杠转义下一个字符,
|…|
转义条之间的所有字符。我认为该实现可以在打印机中任意使用。之所以需要它们,是因为(使用默认的读卡器设置)
(符号名称“a)
“a”
;函数返回
'a
,而不再次访问该变量,这超出了范围。另外,
eq
也不适用于测试字符相等性。使用。请参阅文档如何谈论对字符相等性测试的支持?对于says*来说,允许实现在任何时候对字符和数字进行“复制”*当然,这也是一个很好的解决方案。
(mapcar #'convert '(#\h #\e #\l #\l #\o))
(|h| |e| |l| |l| |o|)