我可以使用memfn创建一个调用 java 函数的 clojure 函数。
(macroexpand '(memfn startsWith prefix))
=> (fn* ([target2780 prefix] (. target2780 (startsWith prefix))))
((memfn startsWith prefix) "abc" "a")
=> true
memfn
要求函数名是符号。我想知道是否可以编写一个宏来调用名称以字符串形式提供的任意方法。也就是说,我希望能够调用以下内容:
(def fn-name "startsWith")
=> #'user/fn-name
(macroexpand '(memfn' fn-name "prefix"))
=> (fn* ([target2780 prefix] (. target2780 (startsWith prefix))))
((memfn fn-name "prefix") "abc" "a")
=> true
我能想到的唯一方法是使用read-string
.
(defmacro memfn' [fn-name arg-name]
`(memfn ~(read-string fn-name) ~arg-name))
编辑:使用 read-string 和 eval 的版本实际上按我想要的方式工作。
(defn memfn' [fn-name arg-name]
(eval (read-string (str "(memfn " fn-name " " arg-name ")"))))
我是否缺少一个基本的宏构建工具来获取符号引用的字符串并将其转换为文字而不可能执行代码read-string
?
感谢您的任何想法!