如何在公共lisp中将字符转换为符号



这里是完整的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)?我发现internmake-symbol与此相关,但它们需要字符串作为参数。

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)))
(defun converter (c)
(if (characterp c)
(make-symbol (string c))))

您可以使用make符号并将符号转换为字符串。

(setq my-sym (converter #a))

稍后回答我自己的问题:

此外,我想知道在常见的lisp中是否有将字符列表转换为符号列表的函数,如:(#\h#\e#\l#\l#\o(到(h e l 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|)