我想只打印LISP列表中的字符,我需要在CLisp中验证原子是否不是数字。我怎么能这样做?
答案 0 :(得分:1)
以下是如何遍历列表并检查非数字的内容:
(loop for thing in list
do (if (numberp thing)
(format nil “I’m a number: ~a~%” thing)
(format nil “Not a number!~%”)
format
类似于C中的printf
。loop
是Common Lisp中迭代的宏。除了说“用英语阅读关键词并猜出它们的意思”之外,解释它的工作方式也超出了这个答案的范围,并且有很多关于loop
在线的解释,例如“黑带循环”一章Peter Seibel的 Practical Common Lisp 可以在线免费获得。
以下是如何只编写列表中的字符。为了多样化,这个明确地定义了一个函数并使用更高阶的列表操作函数而不是显式循环。因此它可能更慢。
(defun print-characters (list)
(let ((chars (remove-if-not #’characterp list)))
(mapc #’write-char chars)))
remove-if-not
返回一个与输入内容相同的新列表,除了它只包含谓词(在本例中为characterp
)返回true的元素。当且仅当其输入是字符时,characterp
才返回true。
mapc
将函数应用于列表的每个元素,并丢弃返回值。在这种情况下write-char
使用一个参数调用时会将一个字符写入*standard-output*
。
答案 1 :(得分:1)
我假设您要问:&#34;给定项目列表,如何过滤仅列出列表中的数字?&#34; < / p>
如果是,请参加示例会话: 给出一个清单: 获取所有数字: 并且(为了完整性)做相反的事情(即删除数字):CL-USER 11 > (setq mylist '(4 "foo" 10 'bar 2.5 "baz"))
(4 "foo" 10 (QUOTE BAR) 2.5 "baz")
CL-USER 13 > (remove-if-not #'numberp mylist)
(4 10 2.5)
CL-USER 14 > (remove-if #'numberp mylist)
("foo" (QUOTE BAR) "baz")