clojure-russia

Работа и релокейт: #jobs-rus | #clojure-russia-offtop Телеграм-чат https://t.me/clojure_ru
potapenko 2017-09-11T13:02:48.000122Z

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

(ns any.namespace)

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

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

anjensan 2017-09-11T13:03:53.000173Z

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

ilevd 2017-09-11T13:11:04.000057Z

First argument to def must be a Symbol

anjensan 2017-09-11T13:19:33.000263Z

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

ilevd 2017-09-11T13:19:48.000203Z

Или спека

anjensan 2017-09-11T13:29:37.000002Z

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

ilevd 2017-09-11T13:30:11.000096Z

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

ilevd 2017-09-11T13:36:29.000402Z

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 это как?

anjensan 2017-09-11T13:36:53.000573Z

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

ilevd 2017-09-11T13:37:16.000450Z

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

misha 2017-09-11T15:20:36.000358Z

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

anjensan 2017-09-11T15:23:06.000098Z

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

misha 2017-09-11T15:23:11.000420Z

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

anjensan 2017-09-11T15:24:08.000756Z

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

misha 2017-09-11T15:24:16.000451Z

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

misha 2017-09-11T15:24:44.000410Z

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

anjensan 2017-09-11T15:24:45.000227Z

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

misha 2017-09-11T15:25:14.000342Z

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

anjensan 2017-09-11T15:25:28.000193Z

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

anjensan 2017-09-11T15:25:42.000180Z

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

misha 2017-09-11T15:25:59.000245Z

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

anjensan 2017-09-11T15:26:03.000557Z

неа

misha 2017-09-11T15:26:26.000396Z

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

anjensan 2017-09-11T15:26:27.000087Z

https://clojuredocs.org/clojure.core/bean

misha 2017-09-11T15:30:27.000544Z

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

misha 2017-09-11T15:30:42.000681Z

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

anjensan 2017-09-11T15:32:08.000468Z

где тут namespaced-keywords ? 😃

2017-09-11T15:35:40.000308Z

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

anjensan 2017-09-11T15:36:48.000374Z

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

2017-09-11T15:37:41.000365Z

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

anjensan 2017-09-11T15:40:04.000690Z

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

2017-09-11T15:42:40.000575Z

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

2017-09-11T15:43:13.000725Z

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

misha 2017-09-11T15:53:28.000321Z

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

anjensan 2017-09-11T15:54:04.000425Z

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

anjensan 2017-09-11T15:56:39.000575Z

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

misha 2017-09-11T16:03:34.000613Z

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

anjensan 2017-09-11T16:06:40.000498Z

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

anjensan 2017-09-11T16:07:02.000378Z

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

anjensan 2017-09-11T16:07:40.000157Z

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

anjensan 2017-09-11T16:08:23.000275Z

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

anjensan 2017-09-11T16:08:48.000341Z

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

anjensan 2017-09-11T16:09:06.000633Z

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

misha 2017-09-11T16:09:33.000399Z

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

anjensan 2017-09-11T16:09:49.000391Z

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

anjensan 2017-09-11T16:10:02.000545Z

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

misha 2017-09-11T16:10:58.000259Z

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

anjensan 2017-09-11T16:11:51.000273Z

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

misha 2017-09-11T16:11:53.000378Z

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

anjensan 2017-09-11T16:12:04.000393Z

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

misha 2017-09-11T16:12:09.000100Z

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

misha 2017-09-11T16:13:03.000041Z

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

anjensan 2017-09-11T16:14:07.000395Z

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

anjensan 2017-09-11T16:15:26.000318Z

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

misha 2017-09-11T16:15:37.000267Z

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

anjensan 2017-09-11T16:15:39.000679Z

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

misha 2017-09-11T16:16:21.000420Z

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

misha 2017-09-11T16:16:59.000361Z

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

anjensan 2017-09-11T16:17:37.000142Z

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

anjensan 2017-09-11T16:18:23.000051Z

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

misha 2017-09-11T16:18:27.000224Z

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

anjensan 2017-09-11T16:19:28.000012Z

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

anjensan 2017-09-11T16:19:37.000394Z

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

misha 2017-09-11T16:20:45.000223Z

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

anjensan 2017-09-11T16:21:34.000046Z

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

anjensan 2017-09-11T16:21:42.000403Z

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

anjensan 2017-09-11T16:22:20.000283Z

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

misha 2017-09-11T16:23:08.000330Z

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

anjensan 2017-09-11T16:23:14.000301Z

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

anjensan 2017-09-11T16:23:37.000243Z

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

anjensan 2017-09-11T16:23:43.000685Z

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

misha 2017-09-11T16:23:54.000110Z

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

misha 2017-09-11T16:25:03.000140Z

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

dottedmag 2017-09-11T17:46:45.000605Z

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

dottedmag 2017-09-11T17:47:16.000102Z

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

dottedmag 2017-09-11T17:47:59.000077Z

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

👍 4
misha 2017-09-11T17:59:08.000292Z

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

dottedmag 2017-09-11T18:11:03.000501Z

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

dottedmag 2017-09-11T18:16:36.000391Z

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

potapenko 2017-09-11T19:04:31.000252Z

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