Зависимая от среды диспетчеризация протоколов/мультиметодов в clojure

Я столкнулся с проблемой архитектуры определенной части моего программного обеспечения. Допустим, у меня есть функция с именемmake-temp-dir(и многие другие ), которые делают некоторая темная магия в зависимости от текущей ОС. Я хочу иметь возможность поставить реализации этих методов для каждой ОС в отдельном пространстве имен.

Во-первых, я считаю, что протоколы (, если это возможно, )или мультиметоды являются решением проблемы. это. Однако я никогда не видел примера их использования с реализациями охватывая несколько пространств имен. И я не могу понять, как это будет работать вне.

Во-вторых, если я буду использовать для этого протоколы, мне придется как-то вызывать методы. например

(make-temp-dir current-os arg-1 arg-2)

Почему-то передача os в качестве первого аргумента все время выглядит не слишком хорошо мне. Ради семантики я бы хотел, чтобы make-temp-dirвзяли умный решения в зависимости от ОС. Конечно, я могу использовать некоторые макросы и сделать что-то вроде

(doto current-os
  (make-temp-dir arg-1 arg2))

, но это кажется неправильным.

Как это сделать? Или я иду не тем путем? Любая помощь приветствуется.

Изменить:Хорошо, большое спасибо @kotarak, мне удалось заставить что-то работать. Всем, кто наткнется на это,https://gist.github.com/2477120. Он работает нормально, я думаю, что я пойду с этим. Всем спасибо.

6
задан Shrikant Sharat 12 July 2012 в 03:13
поделиться