Clojure требуется синтаксическое обоснование - программирование
Подтвердить что ты не робот

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

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

Например, в следующем случае, почему этот вектор требуется для цитирования:

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

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

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

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

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

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

(require '(clj-json.core))

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

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

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

  • в первом примере почему нужно указывать вектор?
  • почему это не нужно указывать в макросе ns?
  • почему нотация списка не позволяет :as?

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

4b9b3361

Ответ 1

  • в первом примере почему нужно указывать вектор?

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

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

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

а не:

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

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

  • почему это не нужно указывать в макросе ns?

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

  • почему нотация списка не позволяет: как?

Извините, я не знаю ответа на этот вопрос.

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

"Ниже будут загружены библиотеки clojure.zip и clojure.set сокращенно "s".

(require '(clojure zip [set :as s]))