它向编译器承诺 lambda 将只调用一次,因此任何在词法作用域中捕获的变量都可以被垃圾回收。
如果使用不当,这可能是不安全的,但在某些上下文中,为了避免不必要地保留未使用的内存,这是必要的
这个例子展示了它是如何工作的
user=> (let [x (Object.)] (def x (^:once fn* [] x)))
#'user/x
user=> (x)
#object[java.lang.Object 0x2189e7a7 "java.lang.Object@2189e7a7"]
user=> (x)
nil