Для чего идиоматическая clojure: использовать - PullRequest
8 голосов
/ 27 апреля 2011

Я видел несколько разных способов для :use в clojure - что за идиоматический / предпочтительный метод?

# 1

(ns namespace.core
  (:use [[something.core]
         [another.core]]))

или # 2. РЕДАКТИРОВАТЬ: Используйте это св сочетании с :only.

(ns namespace.core
  (:use [something.core]
        [another.core]))

или # 3

(ns namespace.core
  (:use [something.core
         another.core]))

или # 4

(ns namespace.core
  (:use (something.core
         another.core)))

или # 5 РЕДАКТИРОВАТЬ: Это идиоматический, но одинследует использовать :use как в # 2

(ns namespace.core
  (:use something.core
        another.core))

Ответы [ 4 ]

8 голосов
/ 27 апреля 2011

Вариант № 5 идиоматичен, если только вы не передаете дополнительные параметры, такие как: only,: exclude и т. Д. В блоге Колина подробно рассматриваются параметры.

API для работы с пространствами имен неоправданно труден для изучения. Тем не менее, он, безусловно, достаточно способен для широкого спектра применений, поэтому давление для перезаписи еще не достигло точки кипения для всех.

4 голосов
/ 28 апреля 2011

На самом деле ни один из них не является идиоматическим. У вас всегда должно быть предложение: only в вашем: использовании. Лучше всего добавить: только к # 2 Если вы не хотите перечислять все переменные, которые вы берете из другого пространства имен, подумайте (: require [foo.bar: as bar]).

Следует отметить, что следует отметить, что (: use (clojure set xml)) оператор считается беспорядочной операцией и поэтому обескуражен. [...] При организации вашего код в пространствах имен, рекомендуется экспортировать и импортировать только те необходимые элементы.

- из Радости Clojure, стр. 183.

Единственным исключением является то, что тестовое пространство имен должно использовать только пространство имен, которое оно тестирует.

2 голосов
/ 27 апреля 2011

Случаи 1, 3 и 4 недействительны и дают некоторые исключения. Я не видел 2 - только в сочетании с :only или подобным.

(ns namespace.core
  (:use
    [something.core :only (x)]
    another.core))

Я обычно использую 5.

0 голосов
/ 22 ноября 2013

В Clojure 1.4+ я бы вообще не использовал use. require может сделать все, что use может сделать сейчас, поэтому забудьте о use. Еще одна вещь для беспокойства.

Если вы хотите use -подобное поведение (все еще плохая форма, imo), вы можете сделать:

(ns namespace.core
  (:require
    [something.core :refer :all]
    [another.core :refer :all]))

Если вы хотите :use .. :only поведение, используйте:

(ns namespace.core
  (:require
    [something.core :refer [foo bar]]
    [another.core :refer [quux]]))

Более подробно: В Clojure 1.4 для чего нужны ссылки в рамках require?

...