这里完全是Lisp初学者。
我想知道如何将字符转换为符号。我只想将#\a
转换为a
这是我到目前为止所做的:
(defun convert(char)
(if(eq char #\a)
(setq char 'a))
char)
这实际上是可行的,但是我不想添加26个条件(字母字母)并编写一个长代码。
我还想知道通用的lisp中是否有任何功能可以将字符列表转换为符号列表,例如:(#\h #\e #\l #\l #\o)
到(h e l l o)
?我发现与此相关的intern
和make-symbol
,但是它们需要字符串作为参数。
答案 0 :(得分:4)
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)
(case char
(#\a 'a)
(#\b 'b)
(otherwise char)))
如上所述,“实际”解决方案是:
(defun convert (char)
(intern (string char)))
答案 1 :(得分:1)
(defun converter (c)
(if (characterp c)
(make-symbol (string c))))
您可以使用make-symbol并将符号转换为字符串。
(setq my-sym (converter #\a))
答案 2 :(得分:0)
过一会儿回答我自己的问题:
我还想知道通用lisp中是否有任何功能可以将字符列表转换为符号列表,例如:(#\ h#\ e#\ l#\ l#\ o)到(hello)?< / em>
我可以使用以下转换功能将单个字符转换为符号:
(defun convert (c)
(if (characterp c)
(intern (string c))))
由于LISP的主要思想之一是“处理列表”,因此我可以使用map函数之一将一个操作应用于列表的每个元素。
(mapcar #'convert '(#\h #\e #\l #\l #\o))
此处mapcar
函数将显示符号列表:
(|h| |e| |l| |l| |o|)