Nic*_*ton 4 macros function clojure
所有,
我想创建一个函数,它接受表示java方法的符号并将其应用于某个对象:
(user=> (defn f [m] (. "foo" (m)))
Run Code Online (Sandbox Code Playgroud)
当我执行此操作时,我得到的结果与我的预期有很大不同
user=> (f 'getClass)
java.lang.IllegalArgumentException: No matching method found: m for class java.lang.String (NO_SOURCE_FILE:0)
Run Code Online (Sandbox Code Playgroud)
2个问题:
1>为什么符号m被称为'.'的第二个arg.函数而不是绑定到m的值?
2>我将如何实际做我想做的事情?
Bri*_*per 12
它不起作用,因为它.是一种特殊的形式,并有特殊的评估规则.普通函数调用评估它们的参数,但.不评估method-name参数.
要使其工作,请使用eval或将您的功能更改为宏.
user=> (defmacro foo [o m] `(. ~o ~m))
#'user/foo
user=> (foo 123 toString)
"123"
user=> (defn bar [o m] (eval `(. ~o ~m)))
#'user/bar
user=> (bar 123 'toString)
"123"
Run Code Online (Sandbox Code Playgroud)
使用eval不建议一般.
| 归档时间: |
|
| 查看次数: |
398 次 |
| 最近记录: |