正如 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
不过要小心处理宏——它们很有趣,但也容易被滥用。;)