在lisp中搜索用户输入的数组

时间:2015-04-04 21:18:07

标签: lisp

如何在Lisp中搜索用户输入的数组?

一些一般性指导非常有用!

谢谢!

我应该使用"会员"或者"找到" ?

(defun enterl()  
  (princ "Enter First Number")
  (setq userInput (read-line))
  (setf num1 (parse-integer userInput))
  (member num1 '(5 9 1 2)))

1 个答案:

答案 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

有时它们不会成为工作的工具。例如。如果您在找到项目的索引后,可能需要使用loopreduce,或者转而使用自己的递归。

修改

read-line返回包含您输入的所有内容的字符串。因此,除了split it into values所需的一个字符串之外,您将无法从中获取数组或元素列表。 read与读取代码的功能相同,因此如果您的输入是有效的LISP数据,那么您就是好的。例如。如果您将(1 2 3)输入read,则会获得包含3个数字的列表。

您可以使用setq的本地绑定,而不是使用setflet。例如。

(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