Common Lisp 符号相等

Rob*_*ert 1 lisp common-lisp

在互联网上的大多数示例中,符号相等性很简单:

(eq 'sym 'sym)
t
Run Code Online (Sandbox Code Playgroud)

在我的程序中,我想比较自定义包中的符号:

(defpackage #:my-package
  (:use    #:common-lisp)
  (:export #:my-function))

(in-package #:my-package)

(defun my-function (value)
  (cond
    ((eq value 'sym)
     (format t "SYM: YES~%"))
    (t
     (format t "SYM: NO~%"))))

(in-package #:common-lisp)

(my-package:my-function 'sym)
Run Code Online (Sandbox Code Playgroud)

但是当执行这段代码时,它显示:

SYM: NO
Run Code Online (Sandbox Code Playgroud)

这两个符号似乎不同:

(eq 'sym 'my-package::sym)
nil
Run Code Online (Sandbox Code Playgroud)

原因似乎很容易理解,在给定包中驻留的符号不等于在另一个包中驻留的同名符号。很公平!但是无论包如何,比较 2 个符号的习惯用法是什么?

我们应该首先将其转换为字符串并比较字符串吗?

(defpackage #:my-package
  (:use    #:common-lisp)
  (:export #:my-function))

(in-package #:my-package)

(defun my-function (value)
  (cond
    ((string= (symbol-name value) "SYM")
     (format t "SYM: YES~%"))
    (t
     (format t "SYM: NO~%"))))

(in-package #:common-lisp)

(my-package:my-function 'sym)
Run Code Online (Sandbox Code Playgroud)

结果更好,但是关于字符大小写有一个明显的问题。

如何检查 2 个符号是否相同,无论其封装如何?

Xac*_*ach 5

通常的习惯用法是string=,它比较符号的名称而不考虑同一性。

例如:

(eq 'x:a 'y:a) => nil
(string= 'x:a 'y:a) => t
Run Code Online (Sandbox Code Playgroud)