Fork me on GitHub
#clojure-russia
<
2017-10-08
>
mike_ananev06:10:54

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

mike_ananev06:10:10

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

mike_ananev07:10:49

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

dottedmag07:10:57

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

dottedmag07:10:10

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

dottedmag07:10:33

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

mike_ananev07:10:08

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

dottedmag07:10:26

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

mike_ananev07:10:47

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

dottedmag07:10:07

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

dottedmag07:10:18

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

mike_ananev07:10:38

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

mike_ananev07:10:52

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

dottedmag07:10:06

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

dottedmag07:10:30

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

dottedmag07:10:34

А оно не так.

dottedmag07:10:03

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

dottedmag07:10:18

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

dottedmag07:10:35

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

dottedmag07:10:33

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

misha10:10:21

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

ivana18:10:26

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

ivana18:10:39

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

dottedmag19:10:09

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

dottedmag19:10:26

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

ivana19:10:33

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

ivana19:10:04

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

dottedmag19:10:41

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

dottedmag19:10:13

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

dottedmag19:10:41

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

ivana19:10:04

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

ivana19:10:09

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

dottedmag19:10:32

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

dottedmag19:10:53

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

dottedmag19:10:55

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

ivana19:10:25

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

ivana19:10:49

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

dottedmag19:10:52

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

dottedmag19:10:20

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

ivana19:10:52

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

dottedmag19:10:06

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

ivana19:10:59

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

dottedmag19:10:22

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

ivana19:10:21

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

ivana20:10:05

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

dottedmag20:10:17

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

dottedmag20:10:47

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

dottedmag20:10:21

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

ivana20:10:53

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

ivana20:10:03

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

dottedmag20:10:02

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

dottedmag20:10:25

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

dottedmag20:10:59

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

ivana20:10:30

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

dottedmag20:10:27

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

ivana20:10:48

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

dottedmag20:10:54

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

dottedmag20:10:11

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

misha21:10:42

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

misha21:10:49

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

misha21:10:01

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

misha21:10:13

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

mike_ananev22:10:52

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

mike_ananev22:10:16

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

mike_ananev23:10:20

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