lisp - 为什么 CASE 不能用于字符串值而只能用于符号值?

标签 lisp common-lisp land-of-lisp

我读了《口齿不清的国度》这本书

Because the case command uses eq for comparisons, it is usually used only for branching on symbol values. It cannot be used to branch on string values, among other things.

请解释为什么?

最佳答案

其他两个出色的答案确实回答了所提出的问题。我将尝试回答自然而然的下一个问题 - 为什么 case使用 eql

其实和C中的道理是一样的(对应的switch语句使用的是数字比较):Lisp中的case形式是通常编译成类似 goto 的东西,所以 (case x (1 ...) (2 ...) (3 ...)) 比对应cond .这通常是通过将 case 编译为哈希表查找来实现的,该查找将要比较的值直接映射到子句。

也就是说,下一个问题是 - 为什么不用 equal 哈希表子句查找的 case 变体而不是 eql?好吧,这不在 ANSI 标准中,但是实现可以提供这样的扩展,例如 ext:fcase在 CLISP 中。

另见 why eql is the default comparison .

关于lisp - 为什么 CASE 不能用于字符串值而只能用于符号值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18878832/

相关文章:

lisp - 列表之间的两个公共(public)元素

list - Lisp - 在嵌套列表的列表中查找最大深度

emacs - 如何在 SLIME 中启用彩虹括号?

emacs - 调整文本 : Lisp nesting exceeds `max-lisp-eval-depth

common-lisp - 理解 Lisp 中的数据模式,为什么这些表达式不一样?

functional-programming - 将一个函数分成多行

lisp - .sbclrc 中的运算符 #+ 和 #-

sql - 使用后现代将 json 数据插入 postgresql 数据库

ide - 有哪些 Scheme IDE?

sql-server - 使用集成身份验证将 Windows 上的 SBCL 连接到 SQL Server