Clojure方法缺失

ale*_*ine 7 ruby lisp java clojure

有谁知道如何在Clojure中实现method_missing(àlaRuby)?例如

(defn method_missing [name & args]
     (foo name args))
Run Code Online (Sandbox Code Playgroud)

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

提前致谢!

Nie*_*lsK 10

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

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

我建议阅读更多有关宏及其注意事项的内容.尽管如此,就像在Ruby中一样,动态生成的代码通常更难以调试和维护.通常巧妙地使用其他功能习语可以是更好的结构解决方案.

  • 我同意大部分内容,但我反对声称动态生成的代码很难调试或维护.如果使用高级的话,宏对简化和可维护性是一个很大的好处. (3认同)

Rob*_*lan 5

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

比如

(with-default-method [fxn args default] ...)
Run Code Online (Sandbox Code Playgroud)

会扩大到

(try (fxn args) (catch java.lang.IllegalArgumentException _) (finally default))
Run Code Online (Sandbox Code Playgroud)

以上几乎是挥手,因为我认为这根本不是一个好主意:它滥用了异常系统,我认为它会做出意想不到的事情.

我不是一个Ruby人,但我觉得这个功能已经融入了那种语言; 在java中,并且通过扩展clojure,你必须尝试将其固定,并且它不会很漂亮.