在< hãy chia sẻ suy nghĩ của bạn trong Khảo sát Tình hình Clojure năm 2024!

Chào mừng! Vui lòng xem trang Về chúng tôi để biết thêm về cách này hoạt động.

+1 lượt bỏ phiếu
in Clojure by

Chào各位朋友!
Giải thích vì sao tên hàm "fn*" là không đúng?

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

'user/fnn*

user=> (fnn* 4)
5

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

'user/fn*

user=> (fn 4)
Syntax error (ClassCastException) compiling fn
at (REPL:1:1).
class java.lang.Long cannot be cast to class clojure.lang.ISeq (java.lang.Long is in module java.base of loader 'bootstrap'; clojure.lang.ISeq is in unnamed module of loader 'bootstrap')

Cảm ơn!
:-)

1 Đáp án

+5 lượt bỏ phiếu
  avatar by
chọn lọc by
 
Đáp án tốt nhất

Bởi vì fn*, cùng với một sốyms khác, là một ký hiệu đặc biệt. Tôi bạn nghĩ nó được gọi là compiler intrinsic nhưng đừng chép tôi trên điều này.
such symbols are handled directly by the compiler when it sees them in the right position. So when the compiler sees (fn* ...) it thinks that it's a low-level definition of a function - even though you have created your own definition of fn*.

by
谢谢!
:-)
...