Clojure方法丢失



有人知道如何在Clojure中实现method_missing ( Ruby)吗?例如

(defn method_missing [name & args]
     (foo name args))

如果正确使用,它将对DSL非常有用。

提前感谢!

在Ruby中,method_missing是元编程的主要结构之一。它与Ruby的面向对象结构紧密绑定,可以从"元类"动态地在类中创建方法。这可以做到,因为在Ruby中类也是对象。

由于Clojure是一种函数式语言,模仿这种ruby主义没有什么意义。然而,lisp(比如Clojure)的一个基本习惯是,代码就是数据:因为代码可以生成数据,所以它也可以生成代码。在Lisp中进行这种元编程的主要方法是宏。

我建议阅读更多关于宏和它们的注意事项。需要注意的是,就像在Ruby中一样,动态生成的代码通常更难调试和维护。通常,巧妙地使用其他功能习惯用法可以更好地解决结构问题。

您可以创建一个宏,该宏将函数调用封装在try-catch块中,该块将捕获此类异常。

。比如

(with-default-method [fxn args default] ...)

展开为

(try (fxn args) (catch java.lang.IllegalArgumentException _) (finally default))

上面大部分都是手写的,因为我认为这根本不是一个好主意:它是对异常系统的滥用,我认为它会做一些意想不到的事情。

我不是Ruby用户,但我感觉这个特性已经融入了Ruby语言;在java中,通过扩展clojure,您必须尝试将此连接起来,并且它不会很漂亮。

最新更新