Clojure: реэкспортные переменные - PullRequest
3 голосов
/ 21 января 2012

Есть ли способ реэкспортировать переменные некоторого пространства имен из другого пространства имен?Я хотел бы иметь возможность сделать это:

(ns mine.core
  (:use [incanter core charts datasets io]))

; re-export Incanter somehow

Тогда в REPL я смогу использовать функции Incanter, просто use -ing mine.core.

user=> (use 'mine.core)
nil
user=> (view (histogram (sample-normal 1000)))

Спасибо!

Ответы [ 3 ]

2 голосов
/ 25 января 2012

Раньше я делал это, помещая выражения REPLd use в отдельный файл, который я могу load-file при запуске REPL.Это работало довольно хорошо, потому что я мог поместить все туда и затем получить больше, чем просто одно пространство имен.

Позже я переключился на определение пространства имен «все» и начал свой реплик с использованием директивы leiningend :main , как в этом вопросе SO , который был похож на мой первый подход, но казался более элегантным.

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

1 голос
/ 21 января 2012
0 голосов
/ 19 октября 2016

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

Однако, если вы этого хотите, например, чтобы представить согласованный интерфейс, вы можете сделать это с помощью функции clojure.core/intern, которая делает любой символ «родным» для данного пространства имен. Например:

(ns user)
(intern 'user 'map clojure.core/map)    
(ns new-ns)
(require 'user)
(user/map inc [1 2 3])
; => [2 3 4]    
(use 'user)
; =>  WARNING: map already refers to: #'clojure.core/map in namespace: new-ns, 
;     being replaced by: #'user/map
(map inc [1 2 3]) 
; => [2 3 4]

Обратите внимание, что изменения в исходном пространстве имен символа не будут отражены до тех пор, пока вы не переподберете символ.

...