我期待在下面,我应该可以通过符号函数间接调用我的函数,但它不起作用。我在这做错了什么:
user=> (defn squared [x] (* x x))
#'user/squared
user=> (squared 2)
4
user=> ((symbol "squared") 2)
nil
user=> ((symbol "user" "squared") 2)
nil
user=>
答案 0 :(得分:37)
符号本身不包含你的功能,它的名字就是Var。
这表示“获取名称为{{1}的符号(@
)命名的Var(deref
)的内容(resolve
= symbol
)并将它(作为函数)应用于参数"squared"
:
2
这说“以符号等命名的Var。”:
(@(resolve (symbol "squared")) 2)
两者都有效,因为Vars在被要求充当函数时,会遵从存储在其中的函数。 (如果在未绑定到函数时尝试将Var用作函数,则会导致错误。)
这表示“取名为((resolve (symbol "squared")) 2)
的符号并将其作为函数应用于参数"squared"
” - 请注意该符号本身用作函数:
2
现在符号可以用作函数(它们实现((symbol "squared") 2)
接口),但是当它们以这种方式使用时它们的行为方式是它们在自己的参数中看起来自己,即将它们的参数视为地图和在其中执行查找:
clojure.lang.IFn
如果传递给符号的参数不适合进行查找,则会返回('foo {'foo 2})
; is equivalent to
(get {'foo 2} 'foo)
。