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