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)
语法错误(ClassCastException)编译fn
在(REPL:1:1)。
类java.lang.Long无法转换为clojure.lang.ISeq(java.lang.Long位于模块java.base的加载器'bootstrap'中;clojure.lang.ISeq位于未命名的模块的加载器'bootstrap'中)。

谢谢!
:-)

1 个答案

+5
by
选择
 
最佳答案

因为fn*,与其他一些符号一样,是一个特殊符号。我认为它被称为编译器内建符号,但不要引用我。
这样的符号在编译器遇到它们时直接由编译器处理。因此,当编译器看到(fn* ...)时,它认为这是一个函数的低级定义——尽管你已经创建了自己的fn*定义。

谢谢!
:-)
...