如何验证原子是否不是LISP中的数字?

时间:2017-12-10 13:54:48

标签: common-lisp

我想只打印LISP列表中的字符,我需要在CLisp中验证原子是否不是数字。我怎么能这样做?

2 个答案:

答案 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中的printfloop是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")