誰かがClojureでmethod_missing(Ruby)を実装する方法を知っていますか? など。Clojureメソッドが見つからない
(defn method_missing [name & args]
(foo name args))
DSLを正しく使用すると非常に便利です。
ありがとうございます!
誰かがClojureでmethod_missing(Ruby)を実装する方法を知っていますか? など。Clojureメソッドが見つからない
(defn method_missing [name & args]
(foo name args))
DSLを正しく使用すると非常に便利です。
ありがとうございます!
Rubyでは、method_missing
がメタプログラミングの主要な構成要素の1つです。 Rubyのオブジェクト指向の構造に密接に拘束され、「メタクラス」からクラス内に動的にメソッドを作成します。これは、Rubyクラスでもオブジェクトであるために行うことができます。
Clojureは関数型言語なので、このRubyismを模倣することはほとんど意味がありません。しかし、ClojureのようなLispsの基本的なイディオムの1つは、コードはデータであり、コードはデータを生成できるのでコードも生成することができます。 Lispでこのメタプログラミングを行う主な方法はマクロです。
私は、マクロとそれらのDOSとは何かについてもっと読むことをお勧めします。 Rubyのように、動的に生成されるコードは、一般的にデバッグやメンテナンスが難しいことに注意してください。多くの場合、他の機能的なイディオムを巧みに使いこなすことが、より良い構造的解決策になることがあります。
この種の例外を捕捉するtry-catchブロックに関数呼び出しをラップするマクロを作成することができます。
(with-default-method [fxn args default] ...)
のようなものは、上記
(try (fxn args) (catch java.lang.IllegalArgumentException _) (finally default))
に拡大する私はこれがすべてでは良いアイデアだとは思わないので、ほとんど手を振っている:それは例外システムの乱用だ、と予期しないことが起こると思います。
私はRubyユーザーではありませんが、この機能がその言語に組み込まれていると感じています。 Javaで、そして拡張子clojureで、これを試して、ボルトで固定する必要があります。
どのような場合にこの関数を呼び出せますか? – Brian