Lisp中的等功能

时间:2017-05-29 22:21:44

标签: lisp common-lisp

我想编写一个相等的函数来告诉任何两个数字是相等的,并且符号只与自身相等。如果所有元素的递归相等,则两个列表也应该相等。我在下面写了一个小的相等函数,但它并没有完全达到我想要的效果。

(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函数,reverseappendnullnil,{ {1}},listpatomcdr等。没有地图或其他更复杂的功能。

1 个答案:

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

相关问题