1

我正在尝试在这样的函数中进行比较:

(defun omember (x l)
  (cond
    ((null l) nil)
    ((eq (car l) x) t)
    ((string< (car l) x) (omember (x (cdr l))))
    (t nil)))

它只是遍历列表并在列表 l 的元素中搜索 x。这个想法是因为传递的列表是排序的,你不需要在所有列表中搜索一个值。只要你的值大于你可以返回 nil 的元素。但是“小于”功能不起作用。我为字符串和整数尝试了“string<”和“<”。另外,我想知道是否有一种机制可以将列表中的整数作为字符串并在字符串中进行比较,因为传入的列表可以是整数或字符串。

4

4 回答 4

1

如果您希望它以一般方式工作,您应该将比较函数作为参数传递:

(defun member-of-sorted (item list
                         &key (test #'=) (end-test #'<) (key #'identity))
  (loop :for tail :on list
        :for element := (funcall key (first tail))
        :until (funcall end-test item element)
        :when (funcall test item element)
        :do (return-from member-of-sorted tail))
  nil)

我试图使它尽可能与标准相似member。如果您不想在数字上而是在其他事物上使用它,请传递适当的:test:end-test参数。如果您在同一个使用地点有不同的类型,您可以围绕它包装一个类型表格。

编辑:我应该添加使用示例:

(member-of-sorted 3 '(1 2 3 4 5 6))
=> (3 4 5 6)

(member-of-sorted 3/2 '(1 2 3 4 5 6))
=> NIL

(member-of-sorted "foo" '("bar" "baz" "foo" "quux")
                  :test #'string=
                  :end-test #'string<)
=> ("foo" "quux")

(member-of-sorted #\D '(#\A #\C #\E #\S)
                  :test #'char=
                  :end-test #'char<)
=> NIL

(member-of-sorted #\D '(#\A #\C #\D #\E #\S)
                  :test #'char=
                  :end-test #'char<)
=> (#\D #\E #\S)
于 2012-11-03T11:32:59.523 回答
0

你可以使用apply将函数对象应用于参数列表:

((apply *lessthan* (list (car l) x)) (do something))

或者funcall,正如 wvxvw 指出的那样,它不需要构建额外的列表:

((funcall *lessthan* (car l) x) (do something))
于 2012-11-02T08:14:54.447 回答
0

递归 omember 周围的括号使用错误。

(defun omember(x l)
  (cond
    ((null l) nil)
    ((= (car l) x) t)
    ((< (car l) x) (omember x (cdr l)))
    (t nil)
    )
  )

将使这项工作适用于整数列表

(defun omember(x l)
      (cond
        ((null l) nil)
        ((string= (car l) x) t)
        ((string< (car l) x) (omember x (cdr l)))
        (t nil)
        )
      )

将使其适用于字符串列表

但似乎没有办法让它同时适用于字符串列表和整数列表

于 2012-11-02T21:03:22.983 回答
0

在代码中使用以下内容来区分类型:

[15]> (typep 7 'integer)
T
[16]> (typep "17" 'string)
T
于 2012-11-02T09:17:31.907 回答