使用clojure符号函数进行间接函数调用

Kev*_*vin 27 clojure

我期待在下面,我应该可以通过符号函数间接调用我的函数,但它不起作用.我在这做错了什么:

user=> (defn squared [x] (* x x))
#'user/squared
user=> (squared 2)
4
user=> ((symbol "squared") 2)
nil
user=> ((symbol "user" "squared") 2)
nil
user=> 
Run Code Online (Sandbox Code Playgroud)

Mic*_*zyk 39

符号本身不保留您的功能,Var它的名称.

这表示"获取名称所在的符号()命名的Var()的内容(@= deref)并将其作为函数应用于参数:resolvesymbol"squared"2

(@(resolve (symbol "squared")) 2)
Run Code Online (Sandbox Code Playgroud)

这表示"以符号等命名的Var":

((resolve (symbol "squared")) 2)
Run Code Online (Sandbox Code Playgroud)

两者都有效,因为Vars在被要求充当函数时,会遵从存储在其中的函数.(如果在未绑定到函数时尝试将Var用作函数,则会导致错误.)

这表示"将符号命名"squared"并将其作为函数应用于参数2" - 请注意符号本身用作函数:

((symbol "squared") 2)
Run Code Online (Sandbox Code Playgroud)

现在符号可以用作函数(它们实现clojure.lang.IFn接口),但是当它们以这种方式使用时它们的行为方式是它们在自己的参数中看起来自己,即将它们的参数视为一个映射并在其中执行查找:

('foo {'foo 2})
; is equivalent to
(get {'foo 2} 'foo)
Run Code Online (Sandbox Code Playgroud)

如果传递给符号的参数不是进行查找的有意义,nil则返回.