Fork me on GitHub
#clojure-russia
<
2017-01-10
>
dottedmag00:01:24

@artemyarulin Никак лучше. Ключи в неймспейсе, неймспейс - часть полного имени ключа. Вот приходит к тебе в вызов мапа, а в ней лежат :person/id, :transaction-store/id и :order/id. Как будешь доставать?

dottedmag00:01:21

Т.е. никто не мешает сделать #:person {:id 1, :order/id 2}.

artemyarulin07:01:29

точно да, спасиб

leov10:01:47

@dottedmag огромное спасибо. буду проверять. код запостю а то неприлично

leov10:01:01

(у меня там что-то вроде

(defn init [passed-callback]
  (let [assetsDir (-> (Assets. (neko.App/instance)) (.syncAssets))]
    (-> (SpeechRecognizerSetup/defaultSetup)
        (doto
          (.addListener (reify edu.cmu.pocketsphinx.RecognitionListener
                          (onPartialResult     [_ hypothesis]
                            (when-let [h hypothesis]
                              (passed-callback (.getHypstr h)))) )) ))))


(defn heard-callback [hypothesis]
  ...
)

(defn start []
  (init heard-callback)
 )

leov10:01:13

и оно не поддерживало горячую замену heard-callback)

dottedmag10:01:23

@leov Да, так и есть -- когда ты вызываешь, (init heard-callback), Clojure разыменовывает оба Var`а, и в init приезжает функция-значение. Нужно #'heard-callback передавать.

leov10:01:39

не понял до конца. а можешь ссылку дать, что почитать?

leov10:01:49

почему разыменовывает?

dottedmag10:01:57

Потому что это семантика Clojure.

leov10:01:58

это ссылка на функцию, так? оно её передаёт

leov10:01:14

мнэ. надо учить букварь, похоже)

dottedmag10:01:57

Как происходит evaluation списка? Clojure evaluate первый символ, смотрит, не функция ли это. Если функция, то evaluate'ит остальные аргументы и передаёт в функцию.

leov10:01:18

@mike1452, ничего, кложе-программисты успешно вернули всё это обратно, повсеместно принимая component библиотеку вместо mount как промышленный стандарт

dottedmag10:01:21

Как происходит evaluation символа - clojure находит соответствующий Var и смотрит, что внутри.

dottedmag10:01:52

@leov Я даже не знаю, что читать. Я это понял, посмотрев несколько раз видео, где Рич рассказывает про state model.

leov10:01:14

ок. поеду на работу, приду, буду ещё раз курить твои комментарии, пока не въеду

dottedmag10:01:05

А почему тут называют кложу кложей? Википедия говорит /ˈkloʊʒɜːr/, так что должно быть что-то вроде "кложура".

ponimas10:01:47

по той же причине, что и пайтон питоном

dottedmag11:01:41

Гы, UK и US-произношение python разное 😃

savelichalex11:01:49

надо так) я называю clojure 1️⃣ кложа 2️⃣ кложура 3️⃣ клоджар

andre11:01:46

я клоджар называю )

andre11:01:04

кложа - это closure

andre11:01:18

путают с google closure

ponimas11:01:19

одинаковое, тк монти пайтон и там и там

mike_ananev11:01:44

@leov я думаю тут все же речь идет о конкретной библиотеке. На сам язык, идеологию языка это решение никак не влияет. Интересно было бы увидеть tradeoff когда они принимали решение mount vs component. Может быть в том контексте component выглядел практичнее.

ponimas11:01:27

это про змею.

ponimas11:01:40

а язык назван не в честь змеи

dottedmag11:01:56

Так произношение и змеи, и монти одинаковое

alexander_mihailov11:01:40

Да, только Монти Пайтон это имя собственное и британское, так что есть только один правильный способ произношения.

andre11:01:10

@dottedmag что это значит?

leov11:01:09

а кто-нибудь может прислать базовый пример роутинга на реакте? например с использованием rum

artemyarulin12:01:43

у меня есть кейворд и префикс, хочу сделать namespace-qualified keywords. keyword могет но принимает 2 строки, поэтому получается не красиво

(let [k-ns :customer
      k-v :name]
  (keyword (name k-ns) (name k-v))) ;; => :customer/name
ничо нету больше?

leov12:01:26

а какой должен быть интерфейс? на вид всё ок

artemyarulin12:01:30

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

dottedmag14:01:55

@artemyarulin Тебе не дожно быть нужно этого делать. Расскажи задачу.

artemyarulin14:01:03

люблю русскоязычные сообщества - как сделать Х? Тебе это не нужно (с) troll

dottedmag14:01:09

@artemyarulin Вообще-то это очень старое правило, и не русскоязычное: http://www.catb.org/~esr/faqs/smart-questions.html#goal

dottedmag14:01:59

Манипуляции с ключевыми словами практически никогда не нужны, это же просто идентификаторы.

kuzmin_m14:01:07

В копилку про контекст, глобальный стейт и re-frame https://github.com/Day8/re-frame/issues/137#issuecomment-268376844

andre16:01:13

круто!

nicola18:01:44

@artemyarulin это самый полезный ответ - который можно получить 🙂

tonsky20:01:18

@artemyarulin норм. Это не конверсия, строки внутри кейворда как поля всё равно лежат

tonsky20:01:58

ну и да, юз-кейс выглядит сомнительно, если нужны манипуляции такого рода, тут какая-то система идентификации на кейвордах похоже что строится

tonsky20:01:10

а кейворды это предполагалось что просто константы

tonsky20:01:43

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

tonsky20:01:09

ну и программно генерить кейворд не оч. правильно наверное. Ну, концептуально

tonsky20:01:46

ну и еще про «не нужно этого хотеть». Я думаю под этим подразумевается что-то типа http://xyproblem.info/, т.е. без обид, просто хотят помочь с исходной проблемой, и вопрос — часть того, что нужно исправить

dottedmag21:01:47

@tonsky Генерировать кейворды нехорошо и практически. Хотя бы потому, что они интернятся и не собираются GC.

dragoncube21:01:00

есть например cljs-ajax и он умеет ключи в кейворды конвертить, но они без неймспейсов, а хочется чтобы были с namespace

dragoncube21:01:25

@dottedmag ну ты врядли нагенеришь тысячи кейвордов

dottedmag21:01:49

@dragoncube Зависит от того, что ты делаешь, а этого как раз @artemyarulin и не сказал.

dottedmag21:01:10

А зачем в cljs-ajax делать неймспейснутые ключи?

tonsky21:01:28

В cljs не интернятся. Я почему-то подумал что вопрос про cljs

dottedmag21:01:13

А как там они представляются, кстати? Как какой-то объект со строчками?

dottedmag21:01:45

И сравнение по значению, а не по identity?

tonsky21:01:45

Неймспейс, имя, и все вместе. Три строки

tonsky21:01:12

Но если повезёт то js сравнит строки по identity

dragoncube21:01:14

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

dottedmag21:01:09

Ой, оно само парсит JSON-ответы?

dottedmag21:01:15

Валидацию можно и без неймспейса производить, в спеке же есть опция для этого, а после валидации сырой JSON-ответ использовать неудобно.

dragoncube21:01:18

ну идея в том что могут появляться данные с внешних ресурсов которые нужно конвертить во внутреннее представление

dottedmag21:01:32

Для этого спека дестуктурит, и можно из этого нужный вид собрать. JSON - штука убогая, так что в любом случае какую-то конверсию делать.

dottedmag21:01:56

С transit/edn такой проблемы, очевидно, просто нет.

artemyarulin21:01:46

хотел уже написать зачем оно мне надо, но вы тут так интересно все обсуждаете что я наверно пока подожду troll

artemyarulin21:01:53

>В cljs не интернятся. ага, про CLJS вопрос. А чем это грозит?

dottedmag21:01:50

@artemyarulin В CLJS созданные keywords GC-ятся, так что долгоиграющие программы, создающие keywords, не упадут от ENOMEM

dottedmag21:01:01

Так что это лучше, чем в clj

artemyarulin21:01:57

хм, тогда зачем оно в CLJ вообще?

dottedmag21:01:19

Сравнение keywords с интернированием - O(1), это сравнение указателей.

dottedmag21:01:28

Сравнение keywords без интернирования - это сравнение строк.

artemyarulin21:01:05

А JVM кста строки то не интерирует?

dottedmag21:01:25

Гарантируется только интернирование строковых констант в одном классе.

dottedmag21:01:16

Интернировать произвольные строки - это дорого.

artemyarulin21:01:21

понятно спасибо

artemyarulin21:01:04

>тут какая-то система идентификации на кейвордах похоже что строится tonsky прям все видит. Если кому интересно, делаю БД на CLJS. В основе EAV модель где ключами выступают [entity-name attr-name id]. Но для простоты работы с ним на вход принимаются обычные мапы #:person {:age 22 :name “Joe”} будет сконверчено в (sorted-map [:person :age 1] 22 [:person :name “Joe”]) . Отсюда и необходимость работы с кейвордами Там в реальности чутка сложнее, но если кому очень любопытно то можно посмотреть тут https://github.com/artemyarulin/zerol/blob/master/db_test.cljc#L50

dottedmag21:01:08

Т.е. неймспейс - это название Entity?

dottedmag21:01:14

Ну... Фиг знает. Развалится ведь, если подать на вход карту с ключами из разных неймспейсов?

artemyarulin21:01:43

ага развалится

dottedmag21:01:01

Если так, то может [:person {:age 22 :name "Joe"}] не хуже? А нейспейснутую версию сделать как сахар сверху для тех, у кого квадратные скобки на клавиатуре не работают.

artemyarulin21:01:03

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

dottedmag21:01:59

По количеству кнопок нажатых - то же самое, если }] автоматически вставляется 🙂

artemyarulin21:01:24

да мне наверно просто 1.9 новый синтаксис #:ns {:k1 v1 :k2 v2} понравился вот я его везде и вставляю 🙂