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