2024年Clojure状态调查!分享你的想法。

欢迎!请参阅关于页面以了解更多相关信息。

+1
Clojure

朋友们好!
为什么函数名"fn*"是错误的?

user=> (defn fnn* [x] (+ x 1))

'user/fnn*

user=> (fnn* 4)
5

但是
user=> (defn fn* [x] (+ x 1))

'user/fn*

user=> (fn 4)
语法错误(类型转换异常)在编译fn
时发生(在REPL:1:1)。
类java.lang.Long不能转换为类clojure.lang.ISeq(java.lang.Long位于模块java.base中,属于加载器'bootstrap'; clojure.lang.ISeq位于未命名的模块中,属于加载器'bootstrap')

谢谢!
:-)

1 答案

+5
by
被选中 by
 
最佳回答

因为fn*以及少数其他符号是特殊符号。我认为它们被称为编译器内建符号,但别 цитировать me。
当编译器在正确位置遇到这些符号时,会直接处理这些符号。因此,当编译器看到(fn*)时,它认为这是一个函数的低级定义 - 即使你已经创建了fn*的定义。

谢谢!
:-)
...