Java Clojure方法缺失

Java Clojure方法缺失,java,ruby,clojure,lisp,Java,Ruby,Clojure,Lisp,有人知道如何在Clojure中实现方法(a la Ruby)吗? 例如 如果正确使用,它将对DSL非常有用 提前谢谢 您可以创建一个宏,将函数调用包装在一个try-catch块中,该块将捕获此类异常 e、 差不多 (with-default-method [fxn args default] ...) 将扩展到 (try (fxn args) (catch java.lang.IllegalArgumentException _) (finally default)) 上面提到的大多是挥手致

有人知道如何在Clojure中实现方法(a la Ruby)吗? 例如

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


提前谢谢

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

e、 差不多

(with-default-method [fxn args default] ...)
将扩展到

(try (fxn args) (catch java.lang.IllegalArgumentException _) (finally default))
上面提到的大多是挥手致意,因为我认为这根本不是一个好主意:这是对异常系统的滥用,我认为它会做意想不到的事情


我不是一个喜欢Ruby的人,但我觉得这个特性已经融入到了Ruby语言中;在java中,通过扩展clojure,您必须尝试将其栓接在一起,这不会很好。

在Ruby中,
method\u missing
是元编程的主要构造之一。它与Ruby的面向对象结构紧密结合,从“元类”在类中动态创建方法。这是可以做到的,因为Ruby中的类也是对象

由于Clojure是一种函数式语言,模仿这种Rubyism毫无意义。然而,Lisps(比如Clojure)的一个基本习惯用法是代码就是数据:代码可以生成数据,也可以生成代码。在Lisp中进行元编程的主要方法是宏


我建议你多读一些关于宏以及宏的应做和不应做的事情。不过请注意,就像在Ruby中一样,动态生成的代码通常更难调试和维护。通常,巧妙地使用其他函数习惯用法是一种更好的结构化解决方案。

在什么情况下,您希望调用此函数?我同意大多数这一点,但我反对动态生成的代码很难调试或维护的说法。宏是简化和可维护性的一大福音,只要它们使用得体。我只是想指出,什么时候使用宏应该仔细考虑,什么时候可以使用正常的函数这应该是首选。我来自Ruby,我发现掌握函数组合的威力需要一段时间。使用宏来解决这个问题可能会适得其反。我在Clojure方面没有太多经验,所以我仍然习惯于LISP-ish的想法,比如宏。我完全明白现在有人怎么会滥用权力。谢谢
(try (fxn args) (catch java.lang.IllegalArgumentException _) (finally default))