List 如何在common lisp中将字符转换为符号?
完全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
\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|)