正如 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
尽管宏很有趣且易于滥用,但使用时要小心;)