Fork me on GitHub
#clojure-russia
<
2017-09-11
>
potapenko13:09:48

@anjensan очень распостраненная

(ns any.namespace)

(def ::my-keyword)
(:require [any.namespace :as any-namespace)

(println ::any-namespace/my-keyword)

anjensan13:09:53

ну я понимаю что так можно сделать. но насколько часто это используется в реальных приложениях / библиотеках... можно конкретные примеры?

ilevd13:09:04

First argument to def must be a Symbol

anjensan13:09:33

думаю, там подразумевалось (println ::my-keyword)

ilevd13:09:48

Или спека

anjensan13:09:37

ах да, кстати, spec - хороший пример где активно используются namespaced keywords...

ilevd13:09:11

Ага, но хотелось бы узнать зачем еще)

ilevd13:09:29

However what happens if two libraries modify the same map? On the same key? Then we are in trouble, because one overwrites the other.
https://kotka.de/blog/2010/05/Did_you_know_III.html это как?

anjensan13:09:53

ну зачем их использовать в принципе ясно - кой где они требуются именно namespace-qualified (например для иерархий)... + как приватный-скрытый ключ в "чужих" мэпах

ilevd13:09:16

Еще для event-ов в reframe, да, можо придумать ситуаций

misha15:09:36

@anjensan очень часто используется в библиотеках и приложениях. Так же часто, как ссылки с одного сайта на другой.

anjensan15:09:06

@misha реквестирую конкретные примеры 😃

misha15:09:11

Только полезнее думать про неймспейсы кивордов как о названии таблиц в базе данных, а не как о неймспейсе с кодом. Они, конечно, могут 1к1 быть, но это не цель

anjensan15:09:08

аага. т.е. ююзаются в некоторых DSLях, например в spec, и во всяких sql-либах ?

misha15:09:16

Ну представь себе мапы с неймспейсед кивордами, вместо рекордов/жава бинов - вот тебе и юзкейс

misha15:09:44

Дсл тут как-то ортогонально, мне кажется

anjensan15:09:45

а где, позвольте узнать, в джава бинах неймспейсы ? 🙂

misha15:09:14

package откуда ты их импортируешь, лол

anjensan15:09:28

так, для справки, в джавабинах названия пропертей не имеют неймспейсов 😃

anjensan15:09:42

ии?... если у тебя два бина из рахных пакетов с одним набором пропертей - все пучком

misha15:09:59

Для тебя это mybean.myprop

misha15:09:26

Mybean - это и есть неймспейс в этом случае

misha15:09:27

Ну класс любой

misha15:09:42

Между фронтэндом/бекендом общаться

anjensan15:09:08

где тут namespaced-keywords ? 😃

roman01la15:09:40

Вроде бы датомы/триплеты в Datomic/DataScript :user/id, :user/name

anjensan15:09:48

@roman01la пасиба. запишем это в категорию "всякие data-query dsl либы" (не только sql)

roman01la15:09:41

Ещё в Rum "приватные" поля в стейте компонента

anjensan15:09:04

подозреваю, что это кейворды типа :: ? (без явного неймспейса)

roman01la15:09:40

Например :rum/args

roman01la15:09:13

Для юзера он явный, когда нужно прочитать поле

misha15:09:28

Что-то мне подсказывает, ты не до конца понимаешь, что такое :: и как его использовать

anjensan15:09:04

хм... может быть. и что такое :: и как его использовать?

anjensan15:09:39

я всегда думал что это синтаксический сахар для reader'а, который подставляет текущий неймспейс (из ns) в качестве неймспейса для кейворда... я ошибаюсь ?

misha16:09:34

Вроде всё так. Только тогда либо я плохо диалог про рум попарсил, либо "без явного неймспейса" не вяжется с :: для рум/аргс

anjensan16:09:40

ну для чего удобно использьвать :: - у тебя, допустим, есть мепа, которую создал кто-то другой. например это ring-request. и ты хочешь к ней добавить свое поле, но боишься коллизий... используешь ::field вместо :field и все пучком

anjensan16:09:02

ближайший аналог в Python, например, это prefixed аттрибуты

anjensan16:09:40

при этом если сильно-сильно приспичит (при дебаге например), то все еще легко получить доступ к этому полю из другого неймспейса

anjensan16:09:23

так вот для меня лично я rum не знаю и не испытываю необходимости учить

anjensan16:09:48

посему при словах "приватные поля" возникла такая ассоциация...

anjensan16:09:06

а так, имхо не вижу разницы между ::rum/args и, например, :rum-args в данном ключе 😃

misha16:09:33

Ну рум - это пример либы, которая, чтоб ты не попутал свои клиентские поля со служебными полями либы - добавила свой неймспейс

anjensan16:09:49

ну так можно и без нейспейсов легко

anjensan16:09:02

но можно и с ними, не спорю.

misha16:09:58

Представь любой конфиг файл средего апликейшена - это, считай, свалка ки/велью, в которой ты можешь неймспейсы использовать вместо всяких подчеркиваний и прочего ада

anjensan16:09:51

ну если конфиги в стиле .properties - согласен. иначе это все равно древовидный объект

misha16:09:53

Всё можно без них, но зачем, если можно с ними? )

anjensan16:09:04

причем в json/yaml, где неймспейсы не юзают

misha16:09:09

С алиасами код будет лаконичнее

misha16:09:03

Не знаю что такое json, у меня всё в edn и транзите kappa

anjensan16:09:07

про алиасы - согласен, это да

anjensan16:09:26

про конфиги - ну пожалуйста. удачи

misha16:09:37

Везде, где сократить имя нельзя без костыля - хрен пойми какие сокращения используют, с которыми потом х## отдебыжишь кто что имел ввиду

anjensan16:09:39

для helloworld можно и в ini засунуть 😃

misha16:09:21

Замени любой ринговский киворд на такой же, только с дефисом вместо слеша, и попробуй код почитать

misha16:09:59

Хелло ворлд можно и на ассемблере налабать, или плату самому вытравить и спаять

anjensan16:09:37

а что такое "ринговский киворд" ?

anjensan16:09:23

я думал всегда что в ринге определены только кейворды без неймспейсов, https://github.com/ring-clojure/ring/blob/master/SPEC

misha16:09:27

Ринг.сервер.мидллвар.фубарбаз/порт какой-нибудь

anjensan16:09:28

вот смотрю на этот SPEC... не вижу там неймспейсов ?

anjensan16:09:37

где мне найти миддлвар.фубарбаз ?

misha16:09:45

Это ключи реквеста/респонса, думаю так слелали, что бы "удобненько", и чтобы быстрее сереализация была в строку. Это ж учасник перфоманс-сенситив кода

anjensan16:09:34

ну вот глянул мидлвар для сессии - там есть :session и :session/key... сильно сомневаюсь что :session-key было бы хуже 😃

anjensan16:09:42

учитывая что :session алиасами не сокращается

anjensan16:09:20

гляжу nested-params -- никаких неймспейсов

misha16:09:08

Не вижу, не буду искать

anjensan16:09:14

насчет сериализации в строку - а зачем request-response в строку сериализовывать? 🙂

anjensan16:09:37

в смысле там же не (pr-clj будет, а вполне себе (get request :body) и подобное

anjensan16:09:43

где без разницы совершенно какой это кейворд

misha16:09:54

Нууу, или что там по проводу передается troll

misha16:09:03

устал тебе продавать нс киворды. Никогда не пользуйся, оно того не стоит. Обман, чтоб набрать классы (с)

dottedmag17:09:45

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

dottedmag17:09:16

Вот, namespaced keywords играют такую штуку для структур данных Clojure, причём не только для сериализации, но и в райнтайме.

dottedmag17:09:59

Ключевое свойство здесь - композируемость. Можно взять две карты и слить их в одну, и всё будет продолжать работать.

misha17:09:08

Что ты тут теорию-то, конкретнее давай kappa

dottedmag18:09:03

Вот, я когда-то это наваял, и неймспейсы были крайне в тему: http://doc.apsstandard.org/2.1/_downloads/package-format-specification-12.pdf

dottedmag18:09:36

Есть ещё у нейспейснутых кивордов одна гигантская фича: если ты собираешься расковыривать что-то большое, неизвестное и плохо документированное, то на вопрос "откуда же эта <censored> <censored> штука приехала в функцию?" ответ ищется за минуту, а не за час.

potapenko19:09:31

я неймспейсед кейворды в re-frame использую, плюс CIDER их автокомлитит