正如 Alex 指出的,self 并不存在,但既然 Clojure 是一个 Lisp,你可以很容易地添加这种支持。我不建议你这样做,但这很有趣。
我们将需要符号宏,这些宏的工作方式类似于宏,但它们是符号(在这种情况下,我们将使用来自 org.clojure/clojure.tools.macro 库的 symbol-macrolet)。
试试这个!
从命令行
clj -Sdeps '{:deps {org.clojure/tools.macro {:mvn/version "0.1.2"}}}'
一旦你有一个 repl,我们将导入 tools.macro 库
(require '[clojure.tools.macro :refer [symbol-macrolet]])
然后,我们将定义一个新的宏,defns,这将允许你使用 self 来引用函数名
(defmacro defns
[name & args]
`(symbol-macrolet [~'self ~name]
(defn ~name
~@args)))
用法
使用 defns 定义一个函数
(defns foo
([] (self 2))
([n] (* 2 n)))
测试一下
user=> (foo)
4
user=> (foo 5)
10
尽管宏很有趣,也很容易滥用,所以要小心使用宏;)