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中一样,动态生成的代码通常更难以调试和维护.通常巧妙地使用其他功能习语可以是更好的结构解决方案.
您可以创建一个宏,它将在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,你必须尝试将其固定,并且它不会很漂亮.