Метод Clojure отсутствует - PullRequest
       10

Метод Clojure отсутствует

7 голосов
/ 03 сентября 2011

Кто-нибудь знает, как реализовать method_missing (как Ruby) в Clojure? Э.Г.

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

Это будет очень полезно для DSL, если используется правильно.

Заранее спасибо!

Ответы [ 2 ]

10 голосов
/ 04 сентября 2011

В Ruby method_missing является одной из основных конструкций для метапрограммирования.Он тесно связан с объектно-ориентированной структурой Ruby, динамически создавая методы в классе из «метаклассов».Это можно сделать, потому что в Ruby классы тоже являются объектами.

Поскольку Clojure является функциональным языком, имитация этого Rubyism не имеет большого смысла.Однако одна из основных идиом Лиспа (например, Clojure) заключается в том, что код - это данные: и поскольку код может генерировать данные, он также может генерировать код.Основной способ выполнения этого метапрограммирования в Лиспе - это макросы.

Я бы посоветовал прочитать больше о макросах, их принципах и запретах.Имейте в виду, что, как и в Ruby, динамически генерируемый код, как правило, сложнее отлаживать и поддерживать.Часто разумное использование других функциональных идиом может быть лучшим структурным решением.

5 голосов
/ 03 сентября 2011

Вы можете создать макрос, который будет оборачивать вызовы функций в блок try-catch, который будет перехватывать исключения такого рода.

Например, что-то вроде

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

расширилось бы до

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

Вышеизложенное в основном махает рукой, потому что я не думаю, что это хорошая идеявообще: это злоупотребление системой исключений, и я думаю, что это будет делать неожиданные вещи.

Я не Ruby, но у меня такое ощущение, что эта функция встроена в этот язык;в java, и из-за расширения clojure, вам придется попробовать это, и это не будет красиво.

...