我想编写一个相等的函数来告诉任何两个数字是相等的,并且符号只与自身相等。如果所有元素的递归相等,则两个列表也应该相等。我在下面写了一个小的相等函数,但它并没有完全达到我想要的效果。
(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
,{ {1}},listp
,atom
,cdr
等。没有地图或其他更复杂的功能。
答案 0 :(得分:2)
这是一个可能的解决方案(假设新函数的名称是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
(或其他案例)取代。< / p>