我读了《口齿不清的国度》这本书
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 中。
关于lisp - 为什么 CASE 不能用于字符串值而只能用于符号值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18878832/