2011-09-03 7 views
7

誰かがClojureでmethod_missing(Ruby)を実装する方法を知っていますか? など。Clojureメソッドが見つからない

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

DSLを正しく使用すると非常に便利です。

ありがとうございます!

+2

どのような場合にこの関数を呼び出せますか? – Brian

答えて

10

Rubyでは、method_missingがメタプログラミングの主要な構成要素の1つです。 Rubyのオブジェクト指向の構造に密接に拘束され、「メタクラス」からクラス内に動的にメソッドを作成します。これは、Rubyクラスでもオブジェクトであるために行うことができます。

Clojureは関数型言語なので、このRubyismを模倣することはほとんど意味がありません。しかし、ClojureのようなLispsの基本的なイディオムの1つは、コードはデータであり、コードはデータを生成できるのでコードも生成することができます。 Lispでこのメタプログラミングを行う主な方法はマクロです。

私は、マクロとそれらのDOSとは何かについてもっと読むことをお勧めします。 Rubyのように、動的に生成されるコードは、一般的にデバッグやメンテナンスが難しいことに注意してください。多くの場合、他の機能的なイディオムを巧みに使いこなすことが、より良い構造的解決策になることがあります。

+3

私はこれにほとんど同意しますが、動的に生成されたコードはデバッグやメンテナンスが難しいという主張に反対しています。マクロは、巧みに使用されるならば、簡素化とメンテナンス性に大きな恩恵をもたらします。 – amalloy

+0

マクロをいつ使うべきかを慎重に検討する必要があることを指摘したいと思います。通常の機能で何かできるのなら、これが望ましいはずです。 – NielsK

+1

ルビー自身から来て、機能構成の力を握るまでに時間がかかることが分かった。これを回避するためにマクロを使用することは非生産的になります。 – NielsK

5

この種の例外を捕捉するtry-catchブロックに関数呼び出しをラップするマクロを作成することができます。

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

のようなものは、上記

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

に拡大する私はこれがすべてでは良いアイデアだとは思わないので、ほとんど手を振っている:それは例外システムの乱用だ、と予期しないことが起こると思います。

私はRubyユーザーではありませんが、この機能がその言語に組み込まれていると感じています。 Javaで、そして拡張子clojureで、これを試して、ボルトで固定する必要があります。

関連する問題