在互联网上的大多数示例中,符号相等性很简单:
(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 个符号是否相同,无论其封装如何?
通常的习惯用法是string=,它比较符号的名称而不考虑同一性。
例如:
(eq 'x:a 'y:a) => nil
(string= 'x:a 'y:a) => t
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |