如何在Lisp中搜索用户输入的数组?
一些一般性指导非常有用!
谢谢!
我应该使用"会员"或者"找到" ?
(defun enterl()
(princ "Enter First Number")
(setq userInput (read-line))
(setf num1 (parse-integer userInput))
(member num1 '(5 9 1 2)))
答案 0 :(得分:0)
如果你在那里,你可以使用其中任何一个。 member
将为您提供整个子列表,其中first
元素是搜索的字词,而find
仅在找到时为您提供搜索的字词。 find
适用于每个序列,因此它是一个更通用的功能。例如。您可以在字符串中找到一个字母,因为字符串是一系列字母。
;; example data
(defparameter *haystack* '("one" nil "two" "three" "four"))
(defparameter *needle* "two")
;; with find
(find *needle* *haystack* :test #'equal) ; ==> "two"
;; with member
(member *needle* *haystack* :test #'equal) ; ==> ("two" "three" "four")
但是,如果您要搜索空值,则需要使用member
;; with find you can't find nil since it's the default result when the item is not found
(find nil *haystack* :test #'equal) ; ==> nil
(find "not-there" *haystack* :test #'equal) ; ==> nil
;; with member you see the difference since you get the cons which is a true value
(member nil *haystack* :test #'equal) ; ==> (nil "two" "three" "four")
(member "not-there" *haystack* :test #'equal) ; ==> nil
有时它们不会成为工作的工具。例如。如果您在找到项目的索引后,可能需要使用loop
,reduce
,或者转而使用自己的递归。
修改强>
read-line
返回包含您输入的所有内容的字符串。因此,除了split it into values所需的一个字符串之外,您将无法从中获取数组或元素列表。 read
与读取代码的功能相同,因此如果您的输入是有效的LISP数据,那么您就是好的。例如。如果您将(1 2 3)
输入read
,则会获得包含3个数字的列表。
您可以使用setq
的本地绑定,而不是使用setf
和let
。例如。
(let ((list (progn (princ "Enter list Eg. (1 2 3): ") (read)))
(item (progn (princ "Enter an item to search: ") (read))))
;; here you have list and item bound
(member item list :test #'equal))
请注意,您可以通过创建一个显示字符串的函数来抽象progn
,然后调用read
。