Избегайте конфликтов имен в Clojure DSL

В качестве побочного проекта я создаю Clojure DSL для синтеза изображений (. клиск).

Я немного не уверен в наилучшем подходе к именованию функций, когда у меня есть функции в DSL, аналогичные функциям в ядре Clojure, например, функция +или что-то подобное требуется в моем DSL для аддитивной компоновки изображений/выполнения векторные математические операции.

Насколько я вижу, есть несколько вариантов:

  1. Используйте то же имя(+)в моем собственном пространстве имен. Выглядит красиво в коде DSL, но переопределит версию clojure.core, что может вызвать проблемы. Люди могли запутаться.
  2. Используйте то же имя, но требуйте его уточнения(my-ns/+). Избегает конфликтов, но не позволяет людям useиспользовать пространство имен для удобства и выглядит немного некрасиво.
  3. Используйте другое короткое имя, например.(v+). Может быть легко used и избежать конфликтов, но имя немного уродливое и может оказаться трудным для запоминания.
  4. Используйте другое длинное имя, например.(vector-add). Подробно, но описательно, без коллизий.
  5. Исключить clojure.core/+и переопределить с помощью мультиметода+(как предполагает Георгек ).

Пример кода может выглядеть примерно так:

 (show  (v+ [0.9 0.6 0.3] 
             (dot [0.2 0.2 0] 
                  (vgradient (vseamless 1.0 plasma) ))))

Каков наилучший/наиболее идиоматический подход?

9
задан mikera 23 July 2012 в 16:34
поделиться