gpt4 book ai didi

common-lisp - CLOS 是否对字符串有 eql 特化调度?

转载 作者:行者123 更新时间:2023-12-04 10:58:39 32 4
gpt4 key购买 nike

你可以做什么的例子。

(defmethod some-fn ((num real))
(print "an integer"))
(defmethod some-fn ((num real))
(print "a real"))
(defmethod some-fn ((num (eql 0)))
(print "zero"))

(some-fn 19323923198319)
"an integer"
(some-fn 19323923198319.3)
"a real"
(some-fn 0)
"zero"

它也适用于一般的“字符串类型”。
(defmethod some-fn ((num string))
(print "a string"))
(some-fn "asrt")
"a string"

然而,不是特定的字符串
(defmethod some-fn ((num (eql "A")))
(print "a specifict string")))
(some-fn "A")
=> "A string"

我想它不起作用,因为 eql 不能以它工作所必需的方式处理字符串。
(eql "a" "a") => nil

有没有办法做到这一点?

最佳答案

简短回答:是的,它有。

长答案:

你写了:

(defmethod some-fn ((num (eql "A")) (print "a specifict string")))
=> doesn't compile

那是因为你得到了 语法错误 .它应该是:
(defmethod some-fn ((num (eql "A"))) (print "a specific string"))
=> does compile

通常格式为:
(defmethod some-fn ((num (eql "A")))
(print "a specifict string"))

如果您以这种方式对其进行格式化并使用您最喜欢的编辑器的内置缩进工具,您会发现代码的缩进看起来是错误的:
(defmethod some-fn ((num (eql "A"))
(print "a specifict string")))

尝试理解编译器显示的错误消息也可能有所帮助。

回到主题:

您可以将字符串用作任何其他 Lisp 对象,以便在 CLOS 中进行 EQL 调度。

只是有许多可能的字符串看起来像“A”,EQL 比较身份(数字和字符除外)。 EQL 不按字符比较字符串。

通常 (EQL "A""A") 返回 NIL。 (旁注:实际上在编译器编译的代码中,这个表达式理论上可以是T。因为编译器允许重用数据对象以节省编译代码中的空间。这里我们有文字字符串,数据对象。)

如果在命令行输入
(some-fn "A")

它不会触发 EQL 调度。

但这按预期工作:
(defparameter *a-string* "A")

(defmethod some-fn ((num (eql *a-string*)))
(print "a specific string")))

进而
(some-fn *a-string*)

您需要确保该变量具有值。当评估 DEFMETHOD 形式的宏扩展时,评估变量。该值则是用于 EQL 调度的对象。

正如德克在他的回答中提到的,人们可以使用符号。符号的用途是(EQL '|A| '|A|) 通常是T。符号在阅读过程中做EQ。

摘要:

EQL 对字符串的调度在 CLOS 中有效。对于实际使用,您需要调用与 EQL 相同的函数,字符串。

关于common-lisp - CLOS 是否对字符串有 eql 特化调度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2541137/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com