如何比较clojure中的两个@字符

如何比较clojure中的两个@字符,clojure,Clojure,拜托,我怎么能用clojure写这个?我有一个@字符,我想将它与“@”进行比较 例如(=@“@”) 给出错误(ClassCastException java.lang.String不能转换为java.util.concurrent.Future clojure.core/deref-Future(core.clj:2206))您可以引用@using\@将clojure解释为字符文本。默认情况下,@是一个deref表单的reader宏,用于减少clojure中的许多其他内容。无论如何: (= \@

拜托,我怎么能用clojure写这个?我有一个
@
字符,我想将它与
“@”
进行比较

例如
(=@“@”)


给出错误
(ClassCastException java.lang.String不能转换为java.util.concurrent.Future clojure.core/deref-Future(core.clj:2206))
您可以引用@using\@将clojure解释为字符文本。默认情况下,@是一个deref表单的reader宏,用于减少clojure中的许多其他内容。无论如何:

(= \@ \@)

true
如果要检查字符串的第一个字符是否为@,则:

(= \@ (first "@"))

true
以下内容仅适用于Clojurescript,因为它没有字符类型,只使用长度为1的字符串

(= \@ "@")

true ;; in cljs only

在这种比较中有一个固有的冲突,
“@”
是字符串序列,而
\@
是单个字符。如果要确认字符串由与
\@
符号匹配的单个字符组成,则需要执行以下操作:

(let [s "@"]
  (and (= \@ (first s)) (= (count s) 1)))

但是,如果要检测字符串是否包含任何
\@
字符,或者它是否仅以
\@
字符开头,则需要不同的代码。这就是比较字符串和字符的问题——从比较中所需要的内容并不明显。

为什么会出现错误?将您的示例转换为

(= (deref "@"))
测试参数是否可终止引用(实现
IDeref
)。如果不是,它将把这场争论视为未来。它不是,所以它抛出了令人困惑的异常。这种行为是一种缺陷,尽管是很小的缺陷

顺便说一下,
(=x)
对于任何
x
返回
true
,如果它返回的话


显示了对此可以执行的操作。

那么,您是否使用字符“@”作为绑定到某个值的符号,然后希望确保该符号具有值“@”?不管怎样,错误的原因是@是deref函数的读取器宏,该函数基本上用于等待未来的值,在代码中您试图对字符串进行deref,这是不可能的。我想说的是,你的问题需要更多的背景。别忘了德里夫访问原子等等!第二个例子(令人惊讶的一个)对我来说不是真的(在clj 1.10中)。
(=\@“@”)
为“(=\@“@”)的meas返回false:看起来你是在用clojurescript测试它,因为它没有字符类,只要长度为1的字符串,等式检查就解析为true,这并不奇怪。在clojure for jvm中,可以预见它会变为false。通过在电话上使用Fullet检查某些内容而被发现,但并不认为它是正确的。谢谢大家更新了完整的答案。