Common lisp 如何在common lisp中检查列表是否包含字符
我正在学习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,则需要检查名称为一个字符长的符号,例
(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))