clojure требует синтаксического обоснования

Мне трудно понять (и, следовательно, вспомнить) необходимость использования синтаксиса, описанного здесь:http://clojuredocs.org/clojure_core/1.3.0/clojure.core/require, Это кажется противоречивым и неоднородным.

Например, в следующем, почему этот вектор должен быть заключен в кавычки:

(require '[clj-json.core :as json])

Счетчик интуитивно понятен, потому что обычно векторы не заключаются в кавычки (списки заключаются в кавычки, а векторы обрабатываются как данные).

И неравномерно, потому что в этом случае вектор НЕ указан:

(ns xxx 
    (:require [clj-json.core :as json]))

Я понимаю, что требуется функция и:require использование внутри макроса ns только оптически похоже, но все же.

Есть и другие странности, например, я могу сделать это:

(require '(clj-json.core))

Но я не могу сделать это:

(require '(clj-json.core :as json))

Может кто-нибудь ответить на эти вопросы:

in the first example why does the vector need to be quoted? why does it not need to be quoted in the ns macro? why does the list notation not allow :as?

Мне интересно, есть ли причины, почему вещи такие, какие они есть, или если несоответствие просто не было замечено во время разработки.

 Jeremy30 мая 2012 г., 17:42
Проверять, выписыватьсяthis thread в списке clojure-dev, если вы его еще не видели. Я нашел это довольно информативным.

Ответы на вопрос(1)

Решение Вопроса
in the first example why does the vector need to be quoted?

require это функция, поэтому вы должны процитировать их, чтобы предотвратить оценку. В противном случае эти символы будут просматриваться в текущем контексте, что может привести к ошибке или, возможно, к неожиданному поведению. Кстати, я думаю, что это не совсем правильно: «Счетчик интуитивно понятен, потому что обычно векторы не заключаются в кавычки (списки заключаются в кавычки, а векторы обрабатываются как данные)».

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

user=> '{a 1 b 2 c 3}

скорее, чем:

user=> {:a 1 :b 2 :c 3}

Первый способ очень быстро набрать, если я просто хочу быстро получить данные для тестирования.

why does it not need to be quoted in the ns macro?

Макросы не оценивают свои аргументы, они более ленивые, чем обычные вызовы функций, поэтому символы (clj-json.core а такжеjson) не нужно заключать в кавычки, чтобы предотвратить оценку.

why does the list notation not allow :as?

Sorry, I don't know the answer to this one.

Ах, я посмотрел на документы дляrequire и узнал. Поддерживается еще одна форма:

& quot; Следующее загрузит библиотеки clojure.zip и clojure.set сокращенно как "s". "

(require '(clojure zip [set :as s]))
 20 февр. 2016 г., 05:29
Это очень поздний комментарий, но вероятная причина(require '(clj-json.core :as json)) не допускается, что списки вrequire Форма используется какprefix lists, Так,(require '(clj-json.core :as json)) будет эквивалентно(require 'clj-json.core.:as 'clj-json.core.json), что не имеет смысла.
 30 мая 2012 г., 18:06
Да, я на самом деле собирался редактировать или комментировать этот пример, думая, что это может помочь. Что-то все еще не имеет смысла?
 Kevin30 мая 2012 г., 18:04
Хорошо, поэтому я только что понял (после вашего объяснения), что(require ['clj-json.core :as 'json]) работает (вектор без кавычек), но требует заключения в кавычки дважды, а не один раз (вероятно, почему предпочтительным является вектор в кавычках). Мир просто должен иметь смысл, и тогда я могу это принять.
 Kevin30 мая 2012 г., 18:33
с последним примером почему бы не позволить(require '(clj-json.core :as json))? Я предполагаю, что разрешение этого сделало бы некоторую другую принятую форму двусмысленной или кое-что ...

Ваш ответ на вопрос