clojure-russia

Работа и релокейт: #jobs-rus | #clojure-russia-offtop Телеграм-чат https://t.me/clojure_ru
andmed 2017-10-08T05:39:05.000033Z

"clopen sets" / хотя вообще ничего не понял 🙂

andmed 2017-10-08T05:42:03.000020Z

ага, топология должно быть интересна. но не по учебнику

mike_ananev 2017-10-08T06:40:54.000022Z

@dottedmag я читал переписку Алекса Миллера и Томпсона. Когнитект с самого начала сказал, что они сделали any? и not-any? с такой семантикой и просили прекратить дискуссию на эту тему. И поэтому любые призывы изменить это они просто не обсуждали. Поэтому когда в очередной раз перед релизом опять появились эти призывы Миллер написал, что "поезд ушел". Но ушел не в смысле, что они сначала профакапили, а потом исправлять не захотели. А в том, что это было осознанным решением и обсуждать не будут. На этой неделе, я решил приобрести печатное издание "Программирование на Clojure", где речь идет об версии 1.4 Сейчас на носу 1.9 и прошло уже 5 лет с момента издания книги. Ничто в книге не потеряло актуальности. Это благодаря тому, что Рич и команда продумывают целостность языка очень хорошо. И в этом большой плюс, что мы почти всегда в коде просто меняем версию clojure, без изменений в коде (за редким исключением). Такую суперстабильность в других языках еще поискать надо. Как написал Рич, он за продумыванием спеки уже последние N месяцев трудится (вместе с женой), чтобы выпустить релиз и any? и not-any? это нововведения за этой работы. Время покажет будут ли они такими же суперстабильными fn как и остальные функции в core.

mike_ananev 2017-10-08T06:46:10.000005Z

В ответе Рича мне очень понравилось то, что кложа это не то, на чем они зарабатывают. То есть они поставили во главу угла качество языка и его целостность. Деньги вынесли за скобки. Не знаю, но мне интуитивно кажется, что великие вещи так и создаются, когда бабки выносят за скобки, т.к. бабки несут тлен времени: условно говоря, кто платит, тот и заказывает музыку, а это всегда в угоду моде или настроению. И поэтому о стабильности ядра языка можно забыть.

kuzmin_m 2017-10-08T07:13:24.000045Z

переписка про any? и not-any? https://groups.google.com/forum/#!topic/clojure-dev/Wl5-Ugzwqy4

mike_ananev 2017-10-08T07:28:49.000014Z

да, один из трех известных мне тредов

dottedmag 2017-10-08T07:41:57.000027Z

> Когнитект с самого начала сказал, что они сделали any? и not-any? с такой семантикой и просили прекратить дискуссию на эту тему.

dottedmag 2017-10-08T07:42:10.000005Z

Это называется "идите в топку, мы решили, что это правильно, значит это правильно".

dottedmag 2017-10-08T07:42:33.000008Z

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

mike_ananev 2017-10-08T07:48:08.000049Z

Не очень понял, где в этом подходе ошибка? Они говорят, вот новые any? и not-any? и семантика у них такая. в Clojure для того чтобы использовать функцию, нужно прочитать доки и узнать семантику функции. Семантика задекларирована. Хочешь используй, хочешь пиши свою. Главное, что она не меняется.

dottedmag 2017-10-08T07:48:26.000050Z

Тогда можно было бы их назвать fn17 и fn13338, почему нет?

mike_ananev 2017-10-08T07:48:47.000011Z

да. правильно.

dottedmag 2017-10-08T07:49:07.000004Z

not-any? появилось в 1.0, а any? - в 1.9, при этом новая функция не является дополнением к старой.

dottedmag 2017-10-08T07:49:18.000017Z

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

mike_ananev 2017-10-08T07:54:38.000064Z

как по мне, имя функции и семантика неразрывны. а то что, у меня с каким либо именем могут возникать индивидуальные собственные ассоциации или семантика, это ж исключительно зависит от того, кто смотрит (субъективно). вот мне кажется что reduce не правильное название. а вот assembly более правильное название, т.к. мы ведь не уменьшаем/сокращаем коллекцию, как бы делаем сборку

mike_ananev 2017-10-08T07:54:52.000046Z

так до любой функции можно докопаться.

dottedmag 2017-10-08T07:56:06.000050Z

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

dottedmag 2017-10-08T07:56:30.000057Z

not-any? должно быть (not (any?)).

dottedmag 2017-10-08T07:56:34.000038Z

А оно не так.

dottedmag 2017-10-08T07:57:03.000038Z

Если у тебя есть функция not-F, а ты добавляешь F, то not-F должно быть (not (F)), и никак иначе.

dottedmag 2017-10-08T07:57:18.000048Z

Если это нарушается, то названия функций просто перестают что-либо значить.

dottedmag 2017-10-08T07:57:35.000009Z

И можно их заменить закорючками, как в APL, или номерами, как в J.

dottedmag 2017-10-08T07:58:33.000016Z

Лексикон может быть любым (хоть reduce, хоть assembly, хоть fold), но он должен быть непротиворечивым.

misha 2017-10-08T10:24:21.000056Z

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

2017-10-08T18:07:26.000132Z

Дилетантское имхо: все претензии к именованию и следующей из него семантики пытаются обосновать логическими доводами. Однако, забавно то, что порой "логические доводы" не особо таковы, и вырождаются в попытку хоть как-то обосновать выбранное решение. С одной стороны, я согласен с предыдущим оратором, что выглядит очень консистентно, когда not-F = not . F. С другой стороны, на всяких граничных случаях (а в Кложе их имхо больше, чем в иных (С) статических языках), поведение может не соответствовать. И ничего не остается, кроме как воспринимать это как фичу, и просто знать. ЗЫ как пример могу привести претензии к хаскельному length (1,2) == 1 Питонисты массово негодуют 🙂 Но если начнешь им объяснять, что length - это свертка Foldable типа (а это однопараметрический класс типов!) по моноиду Inc, а пара является инстансом любого однопараметрического класса по второму параметру с частично примененным первым, поэтому все правильно и логично (!), то смотрят как на идиота 🙂

2017-10-08T18:10:39.000064Z

ЗЫ Питонисты упомянуты условно (видимо, предыдущий пост навеял), все совпадения случайны 🙂

dottedmag 2017-10-08T19:43:09.000057Z

Интересно, полезно ли хоть где-нибудь, что "пара является инстансом любого однопараметрического класса по второму параметру с частично примененным первым", или это сделано из-за того, что математически это верно?

dottedmag 2017-10-08T19:44:26.000046Z

В математике много изоморфизмов, но не нужно их все тащить в языки программирования.

2017-10-08T19:44:33.000054Z

Чтоб далеко не ходить - в качестве функтора пара очень удобна

2017-10-08T19:45:04.000012Z

надо только выбрать, что положить во вторую позицию

dottedmag 2017-10-08T19:47:41.000005Z

> И ничего не остается, кроме как воспринимать это как фичу, и просто знать

dottedmag 2017-10-08T19:48:13.000041Z

Есть два разных типа сложности: наносная и необходимая.

dottedmag 2017-10-08T19:48:41.000050Z

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

2017-10-08T19:49:04.000018Z

Когда нужно пришить к возвращаемому некоторой сложной функцией значению что-то еще: лог работы, "мутабельный" стейт (привет, велосипедная State-монада), список ошибок при вычислении значения и т.п. - спариваешь это с нужным результатом функции, и тут отлично помогает что пара - и функтор и аппликатив и монада и фолдабл и вышивать и на машинке 🙂

2017-10-08T19:50:09.000016Z

Но чтобы сразу расставить точки над i - разумеется можно все это делать и не думая о таких вещах и не говоря эти слова. Кому как удобнее

dottedmag 2017-10-08T19:50:32.000020Z

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

dottedmag 2017-10-08T19:50:53.000067Z

А в случае с any? это разведение проблемы на пустом месте.

dottedmag 2017-10-08T19:51:55.000048Z

И да, на clojuredocs появится пример, состоящий из объяснения, что (not (any? x)) - это не то же самое, что (not-any? x), и мы все запомним, и будем чморить новичков. Но зачем?

2017-10-08T19:52:25.000091Z

Просто весы - на другой чаше аргументы оппонентов, и они перевесили...

2017-10-08T19:52:49.000069Z

Обратная совместимость, "дикари не поймут" или что там еще

dottedmag 2017-10-08T19:52:52.000030Z

Да не. На другой чаше аргумент "мы уже так зарелизили".

dottedmag 2017-10-08T19:53:20.000062Z

Очень удобно, когда весы в руках того, кто наваливает на одну чашу аргументы 🙂

2017-10-08T19:53:52.000005Z

Реал ворлд... 🙂

dottedmag 2017-10-08T19:55:06.000005Z

Рич часто смеётся над другими – "но мы-то можем сделать лучше!", а получается, что упс, не всегда. И поза, в которую он при этом встаёт, не слишком красивая.

2017-10-08T19:55:59.000084Z

Но можно построить свои -not-any? с любым поведением и семантикой

dottedmag 2017-10-08T19:56:22.000001Z

Можно. Можно даже форкнуть.

2017-10-08T19:57:21.000090Z

На самом деле я оппонирую не потому что не разделяю точку зрения, наоборот 🙂 Просто как попытка рассмотреть ситуацию со всех 3 сторон 🙂

2017-10-08T20:07:05.000020Z

А про пару - буквально на днях писал на Кложе функцию, которая должна возвращать в общем случае немалый такой иерархично вложенный текст SQL-запроса. С которым надо лазить в базу и результат отправлять на клиента. Так хорошо было бы при этом проверять возможные ошибки, собирать их все (!), и если они есть - то не лазить в базу а отправлять их на клиента. Хорошо я с опытом Хаскеля, как-то вывернулся, примотал изолентой возвращаемую пару - текст SQL и лист ошибок. Только все внутренние преобразования пришлось пилить руками (ибо не умею в сабже это идиоматично делать, а функторы/монады знаю что есть, но пока не курил их в Кложе). А в Хаскеле, с этими якобы "ненужными" инстансами и математикой, это решил бы добавив несколько символов. Хорошо еще что хаскельные реально иммутабельные паттерны помогают, а то бы налепил внешний реф/атом для накопления ошибок, и апдейтил/мутировал его из свой функции, как в сях и т.п.

dottedmag 2017-10-08T20:34:17.000046Z

У этого обсуждения есть один плюс: думаю, теперь все запомнили, что any? и not-any? надо запоминать отдельно 🙂

dottedmag 2017-10-08T20:34:47.000107Z

@ivana В clojure.algo.monads есть Writer.

dottedmag 2017-10-08T20:36:21.000120Z

Но я тоже не курил их.

2017-10-08T20:37:53.000054Z

Спасибо, я видел что есть пакет с монадами. Обязательно его раскурю. Просто для рабочего решения "по-бырому" написал сам руками 🙂 Это я просто тебе привел пример из недавней реальной жизни, как реализация инстансов пары помогает. По крайней мере тем, у кого однопараметрические инстансы головного мозга 🙂

2017-10-08T20:42:03.000032Z

А про any?, all?, some? и т.п. остальное значит все нормально? 🙂 Вот вам еще пример "запомним, что это фича" - что это не предикаты! 😉 Они возвращают не булевское значение, а первый не фалсовый элемент - что меня например повергает в изумление, я привык (понятно где) к другому поведению.

dottedmag 2017-10-08T20:43:02.000072Z

Это тоже очень весело, да.

dottedmag 2017-10-08T20:43:25.000066Z

any? предикат, это просто (constantly true)

dottedmag 2017-10-08T20:43:59.000022Z

nil-puning та ещё байда, но это ж лисп.

2017-10-08T20:44:30.000008Z

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

dottedmag 2017-10-08T20:45:27.000100Z

Если на клетке слона прочтёшь надпись "буйвол", не верь глазам своим.

2017-10-08T20:47:48.000007Z

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

dottedmag 2017-10-08T20:49:54.000051Z

Ну да. Впрочем, это всё мелочь.

dottedmag 2017-10-08T20:50:11.000002Z

Вот я сегодня узнал, что в JVM никак не поменять "текущую директорию"

misha 2017-10-08T21:19:42.000043Z

треды про any? не читал, но кажется мне, что всё в контексте спеки происходит. типа если норм спеками покроешь проект, так и не нужно будет предикаты в "классических" юзкейсах применять, типа шальные ифы и кейсы по коду в случайных местах. спека + мультиметодный полиморфизм, и поехали

misha 2017-10-08T21:20:49.000066Z

а если пытаться писать "питон" на кложе - сразу вознимают вопросы о знакомом названии, но неожиданном поведении

misha 2017-10-08T21:26:01.000084Z

+ рич и стю очень любят делать привычные вещи неудобно, чтобы цена сделать иначе, но круче, казалась ниже, как тут: https://github.com/cognitect-labs/transcriptor#keep-dumb-tests-ugly > This is ugly by design, as an inducement to test properties instead of specifics.

misha 2017-10-08T21:27:13.000068Z

это хороший UX приём, когда юзеров нужно переучить с легкого неверного на новое верное

mike_ananev 2017-10-08T22:32:52.000050Z

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

mike_ananev 2017-10-08T22:33:16.000004Z

@misha да, все в контексте спеки.

mike_ananev 2017-10-08T23:11:58.000101Z

прикольная либа: https://github.com/vvvvalvalval/scope-capture

👍 2
mike_ananev 2017-10-08T23:12:20.000010Z

демо работы либы тут: https://vimeo.com/237220354