gpt4 book ai didi

lisp - 比较多个元素

转载 作者:太空宇宙 更新时间:2023-11-03 18:41:35 25 4
gpt4 key购买 nike

所以我想比较来自四个不同列表的四个不同元素。类似于下面的示例,问题是 equal 应该只接收 2 个参数,是否有任何函数可以比较 2 个以上的元素?

(equal (nth 0 '(1 2 3)) (nth 0 '(1 2 3)) (nth 0 '(1 2 3)) (nth 0 '(1 2 3)))

最佳答案

is there any function to compare more than 2 elements?

Common Lisp 中的许多比较函数接受两个以上的参数。例如,所有 =, /=, <, >, <=, >=接受任意数量的参数,这意味着你可以做

(= (nth 0 '(1 2 3))
(nth 0 '(1 2 3))
(nth 0 '(1 2 3))
(nth 0 '(1 2 3)))

如果您需要equal(而不是=)的特定行为,那么您将需要coredump proposed 的方法.由于相等性是可传递的,您可以检查每个元素是否等于第一个元素(或者列表是否为空):

(defun equal* (&rest arguments)
(or (endp arguments)
(let ((x (first arguments)))
(every (lambda (y)
(equal x y))
(rest arguments)))))

(equal* 1 1 1 1)
;=> T

实际上,由于您可以用空列表调用firstrest,您甚至可以去掉第一种情况,因为每个传递空列表时将返回 true:

(defun equal* (&rest arguments &aux (x (first arguments)))
(every (lambda (y)
(equal x y))
(rest arguments)))

在那之后,因为这可能是一个常见的模式,你可以定义一个宏来为你定义这些:

(defmacro def-n-ary-equality (name predicate &rest args)
(let ((arguments (gensym (string '#:arguments-)))
(x (gensym (string '#:x-)))
(y (gensym (string '#:y-))))
`(defun ,name (&rest ,arguments &aux (,x (first ,arguments)))
(every (lambda (y)
(,predicate ,x ,y ,@args))
(rest ,arguments)))))

(def-n-ary-equality equal* equal)
; ==
(DEFUN EQUAL* (&REST #:ARGUMENTS-1005 &AUX (#:X-1006 (FIRST #:ARGUMENTS-1005)))
(EVERY (LAMBDA (Y)
(EQUAL #:X-1006 #:Y-1007))
(REST #:ARGUMENTS-1005)))

关于lisp - 比较多个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27319601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com