我想写一个相等的函数,告诉任何两个数字是相等的,并且一个符号只等于它自己。如果两个列表的所有元素递归相等,则两个列表也应该相等。我在下面写了一个小的 equal 函数,但它并没有完全实现我想要的。
(defun equal (x y)
(if (atom x)
(eql x y)
(if (atom y)
'nil
(if (equal (car x) (car y))
(equal (cdr x) (cdr y))
'nil))))
我的函数应该满足的一些测试用例是:
(my-equal 2.2 3) -> T
(my-equal 2.2 'a) -> NIL
(my-equal '(b 4 (c d (2.2)) e) '(b 2 (c d (0)) e)) -> T
(my-equal '(b 4 (c d (2.2)) e) '(b 2 (5 d (2.2)) e)) -> NIL
请注意,我只想使用基本的 Lisp 操作、现有的 equal
函数、reverse
、append
、null
, nil
, listp
, atom
, cdr
, car
,等。没有 map 或其他更复杂的功能。
最佳答案
这是一个可能的解决方案(假设新函数的名称是 my-equal
):
(defun my-equal (x y)
(cond ((numberp x) (numberp y))
((symbolp x) (eq x y))
((and (consp x) (consp y))
(and (my-equal (car x) (car y)) (my-equal (cdr x) (cdr y))))
(t nil)))
(my-equal 2.2 3) ;; => T
(my-equal 2.2 'a) ;; => NIL
(my-equal '(b 4 (c d (2.2)) e) '(b 2 (c d (0)) e)) ;; => T
(my-equal '(b 4 (c d (2.2)) e) '(b 2 (5 d (2.2)) e)) ;; => NIL
最后一个案例可以用 (t (primitive-equal-function x y))
之类的东西代替(或其他情况)如果你在 x
时关心一些平等测试和 y
是字符串、字符等。
关于lisp - Lisp 中的相等函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44250919/