Common lisp 如何在common lisp中检查列表是否包含字符

Common lisp 如何在common lisp中检查列表是否包含字符,common-lisp,Common Lisp,我正在学习lisp,我遇到了一个问题,我有这个代码 (defun createlist(list) (if (characterp (car lst)) (list (car lst)))) > (print (createlist '(a v a (3)))) 我如何在不写的情况下获得包含字符的列表 >(print (createlist '(#\a b 1))) 这是写字符文字的唯一方法。如果要检测a以及#\a,则需要检查名称为一个字符长的符号,例

我正在学习lisp,我遇到了一个问题,我有这个代码

(defun createlist(list)
    (if (characterp (car lst))
        (list (car lst))))

> (print (createlist '(a v a (3))))
我如何在不写的情况下获得包含字符的列表

>(print (createlist '(#\a b 1))) 

这是写字符文字的唯一方法。如果要检测
a
以及
#\a
,则需要检查名称为一个字符长的符号,例如

(let ((elt (car list)))
  (if (or (characterp elt)
          (and (symbolp elt) 
               (= (length (symbol-name elt)) 1)))
      (list elt)))

a
是一个符号,而不是一个字符。使用
symbolp
进行测试。
(aref“a”0)
将返回一个字符,但我认为这也不是您想要的。编写字符文字的唯一方法是使用
\a
格式。我实际上想将列表传递给createlist,在那里它将检测a、b、c等字符,但我想将列表参数作为(a b c 1 2)而不是(#\a#\b#\c 1 2)传递,我只是用symbolp检查了我的代码,它给出了(a b c 1 2)但是当我第一次使用characterp时,它返回null。谢谢symbolp为我工作。为什么函数名为
createlist
,它应该返回什么?它只是一段代码,我一直停留在这一步,无法继续。代码基本上会接受一个列表参数并遍历它,包括嵌套列表,以查找字符并将其放入新列表中并返回。
(mapcar #'character (remove-if-not #'symbolp '(a b c 1 2)))
;; (#\A #\B #\C)

(mapcar #'list 
        (mapcar #'character 
                (remove-if-not #'symbolp
                               '(a b c 1 2 d))))
;; ((#\A) (#\B) (#\C) (#\D))