lisp - Lisp 中的相等函数

标签 lisp common-lisp

我想写一个相等的函数,告诉任何两个数字是相等的,并且一个符号只等于它自己。如果两个列表的所有元素递归相等,则两个列表也应该相等。我在下面写了一个小的 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 函数、reverseappendnull , 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/

相关文章:

emacs - 如何保存我在 LispBox/Slime 中输入的所有函数?

tree - 打开音乐 : L-System tree generation using lisp

emacs - 如何制作 Emacs 键绑定(bind)来设置变量?

list - 如何在 Lisp 中创建列表的子列表?

lisp - 如何要求 super 普通的标准输入?

variables - 如何修改 Common Lisp 中的函数绑定(bind)?

excel - 是否有用于创建 Excel 电子表格的通用 Lisp 库?

lisp - 如何在 LISP 中覆盖 (defun eval (expr)) 函数

dynamic - Common Lisp 是静态类型还是动态类型?如果两者都是如何完成的?

common-lisp - 代码在 SLIME+SBCL 中运行,但不是普通的 SBCL