Честно говоря, я не планировал создавать свой язык, это случилось само собой. Ещё со времен моего знакомства с программированием, больше всего меня волновала именно сложность, присущая любой предметной области и способы борьбы с оной. Чтобы найти такие ответы, которыми смогут воспользоваться и другие люди, я потратил около 10 лет.

Из всех опробованных мною языков программирования Haskell предоставлял один из самых ясных ответов на этот вопрос - абстрактная алгебра. Несмотря на этот огромный потенциал - он не был раскрыт до конца и по сей день. Поэтому всё что я пытаюсь сделать в Я - это отодвинуть компромисс между простотой использования и обобщённостью концепций ещё дальше (когда я буду рассказывать про устройство композиционных операторов, будет понятно о чём это).

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

Но чтобы композиционностью было удобно пользоваться, я придерживаюсь следующих принципов в дизайне самого языка:
Все интерфейсы должны быть открытыми
Я не считаю инженеров детьми, от которых нужно скрывать детали реализации. Они способны находить применение и выворачивать всё наизнанку - так пускай так и делают, попутно находя новые решения, там где их не видел первоначальный создатель. Вы скрываете детали, потому что зачастую они невероятно уродливы и в них крайне тяжело разобраться (иначе бы их не называли "кишками").
Абсолютно всё можно изменить
С помощью естественных преобразований можно изменить любые объекты/эффекты/примитивы. Можно повлиять на вход/выход функций/атрибутов, изменять область видимости состояния, трансформировать одни структуры данных в другие, разъединять/объединять эффекты между собой.
Избегать слов любой ценой
Каждое слово несёт за собой множество смыслов и длинный шлейф ассоциаций. Поэтому сами слова нужно использовать по-минимуму и они должны иметь как можно чёткие определения. Скажем, я хочу написать функцию remove
, которая удаляет определенный элемент из списка. Должна ли она обойти весь список и удалить все совпадения с образцом или же остановится на первом сопоставлении? Тогда чем она отличается от filter
? Что если я хочу, чтобы сопоставление с образцом было более умудрённым? Удалить первые 4 элемента, соответствующих определенному условию. Или чтобы я за условиями обращался куда-нибудь во внешний мир. Как только таких простых функций недостаточно, приходится писать новые.

Понимаю, что символы с примерами кода непонятны и кажутся сложными. Но на самом деле, все эти операторы состоят из логографических токенов, они работают подобно смысловым ключам в китайских иероглифах (но в отличие от последних, имеют чёткое математическое определение). Я обязательно разберу это в отдельной статье, а пока могу только направить к документации. Самое главное, что эти операторы забирают на себя одну из самых сложных аспектов в программировании - порядок вычислений.

По сути, Я - это eDSL в Haskell
. Он содержит в себе чистую корневую библиотеку (без зависимостей, даже нет base
); другие библиотеки (работа с консолью, ASCII-символы); и специальный шрифт, который преобразовывает определенную последовательность символов в лигатуры (тестировалось в Visal Studio Code).
На данный момент я больше всего сфокусирован на том, чтобы самому набить руку и сделать так, чтобы писать программы в Я было быстрее и удобнее, чем в Python. Я подбираю примеры из различных предметных областей, и постепенно добавляю новые фичи - но так чтобы сложность росла линейно.
Я оставлю несколько ссылок ниже, если у вас есть вопросы (кроме того, зачем нужен ещё один язык программирования) - не стесняйтесь задавать.
В следующий раз напишу больше о том, как естественные преобразования отвечают за весь порядок вычисления в языке, как лемма Йонеды помогает с синтаксисом и как я использую копределы в качестве паттерн-матчинга.
Документация | Пробное видео с Hello, Word! | Репозиторий с примерами | Твиттер
Комментарии (98)
slonopotamus
02.02.2025 07:17Избегать слов любой ценой
Тут есть проблемки.
Клавиатура заточена под ввод букв и цифр, а не вот этой вот вашей красоты.
Люди общаются между собой словами. Все эти значочки надо как-то называть (а значит слова будут)
Незнакомый с нотацией человек мало того что неспособен прочесть написанное, он даже не может нормально задать вопрос "что делает Х", потому что непонятно как назвать Х.
Что-то я подозреваю что гуглить это всё тоже окажется околоневозможно.
Поэтому всё что я пытаюсь сделать в Я - это отодвинуть компромисс между простотой использования и обобщенностью концепций ещё дальше
В смысле, ещё сложнее использовать чем Haskell?
P.S. Посмотрел ваши туториалы. По ним понять решительно ничего невозможно.
iokasimov Автор
02.02.2025 07:17P.S. Посмотрел ваши туториалы. По ним понять решительно ничего невозможно.
Разумеется, туториалы - это следующий шаг после знакомства с самим языком. Вроде никто обычно не жалуется, что не может понять код на языке, которого он не знает. Это нормально. У вас просто не получится с наскока со всем разобраться, минуя фундамент.
В этой статье уже было указано, что я использую лигатуры, а не юникод - поэтому для ввода символа используются буквы. В разделе с операторами объясняется, как их вводить - за каждой буквой закреплён свой токен.
Всё так, можно либо объяснять код, используя слова из предметной области либо самими операторами. В самом Haskell вроде как у
<*>
нет своего названия, но ничего - люди как-то пользуются.Нотация там несложная, нужно просто прочитать страничку с операторами и всё станет на свои места. Но как я уже и говорил ранее, это нормально, что человек, не знающий языка не может его прочитать. Если под читаемостью подразумевается именно С-подобный синтаксис - тогда я могу понять.
Можно либо выделить уже отрендереный символ и вставить его в поисковой ввод, либо просто нажать Backspace и глянуть из каких символов он состоит.
В смысле, ещё сложнее использовать чем Haskell?
Я не могу сказать, что использовать Haskell сложно. Для меня это один из самых лёгких языков программирования с ясной семантикой и предсказуемым поведением. Под "отодвиганием компромиса" имеется ввиду обобщение базовых конструкций в стандартном Haskell.
Если вы знакомы с функцией
zoom
из библиотекиlens
- то вЯ
это контравариантный функтор из категории атрибутов (аналог линз) в категорию стрелок (функций) по первому параметру вState
. И вместо функцииzoom
(которое является словом и имеет свои ассоциации), я могу использовать операторha
(Hom-функтор, contrAvariant). Если этот абзац показался вам сложным, то мне правда нечего вам предложить и этот язык не для вас. Но если вас вдруг заинтересовало, то я могу помочь разобрать и другие аспекты этого языка.CrazyOpossum
02.02.2025 07:17Всё так, можно либо объяснять код, используя слова из предметной области либо самими операторами. В самом Haskell вроде как у <$> нет своего названия, но ничего - люди как-то пользуются.
Инфиксный map/fmap. А >>= это bind. Вопрос даже не в словах, а можно ли это хуглить.
iokasimov Автор
02.02.2025 07:17У меня не получается объяснить, что операторы в Я не надо гуглить - их надо читать. Они состоят из логографических токенов и объясняют, что они делают. Нет нужды к каждому инфиксному оператору добавлять синоним (bind, traverse), только для того, чтобы его запоминать. Вот тут всё объясняется, как это работает: https://muratkasimov.art/Ya/Operators
malkovsky
02.02.2025 07:17Вы можете упрямиться и продолжать настаивать на том, что все вокруг неправильно делают, а надо делать так как вы предложили. Или можете попытаться понять почему другие люди пишут, что у них полная фрустрация от происходящего. Я подписываюсь под каждым пунктом в первом комментарии этого треда. Могу добавить, что мне пришлось лезть в интернет за тем, чтобы найти значение слова "логографический" при том, что я знаю разницу между графемами, морфемами и сенонами. За себя скажу, что если Вы пойдёте по первому пути, то я буду считать, что вы просто сделали язык под себя, и перестану им интересоваться совсем.
P. S. Почему бы Вам не попробовать это дело в азиатской среде продвинуть?
4p4
02.02.2025 07:17Не вижу где автор говорит такие вещи как "все вокруг неправильно делают, а надо делать так как он предложил". Придумал что-то своё, показал другим, в чём проблема? Я не раз видел как на HN или Reddit люди постили гораздо более странные и нишевые вещи, часто бесполезные, порой даже дикие, и другие люди, часто с большой репутацией, уважительно разбирались, интересовались ходом мысли автора, находили даже чем восхититься, давали дельные советы, желали успехов. Ваша личная претензия к автору, похоже в том, что он не принёс ничего полезного лично вам, вот действительно, о чём с такими разговаривать! Ещё же имеют наглость что-то публиковать! Вот так надо каждого экспериментатора затравить, а потом удивляться что на хабр пишут только всякую чушь про котиков и основы питона. Что вы сделали для того чтобы следующий экспериментатор захотел с вами поделиться на хабре своим безумным проектом? Закидали камнями всех предыдущих? Велком некст ван. Да, на сто хобби проектов хорошо если один в итоге станет чем-то полезным, но если остальные 99 не велкомить, то этого одного и не будет никогда! Надо людей мотивировать, помогать им, и другие видя что со скромными проектами людей нормально встречают будут больше стараться. Что блять за комунити такое где все всё знают про все языки и паттерны, а элементарных вещей по комунити билдинг не понимают.
malkovsky
02.02.2025 07:17Не вижу где автор говорит такие вещи как "все вокруг неправильно делают, а надо делать так как он предложил"
В сообщении, на которое я отвечал, буквально написано
У меня не получается объяснить, что операторы в Я не надо гуглить - их надо читать
Я признаю, что мог неаккуратно подобрать, но хоть убейте я не понимаю где Вы в моём сообщении нашли шапкозакидательство с моей стороны. Могу отдельно обратить внимание на то, что вот это
P. S. Почему бы Вам не попробовать это дело в азиатской среде продвинуть?
Не подъеб и не предложение свалить в туман. Это интуитивное предположение, что азиатам, привыкшем к логографическому письму и которым в частности не привыкать делать клавиатуры с иероглифами "Я" может подойти гороздо лучше, чем в рускоязычном или англоязычном сегменте.
Что вы сделали для того чтобы следующий экспериментатор захотел с вами поделиться на хабре своим безумным проектом? Закидали камнями всех предыдущих?
Пишу технические статьи осознавая, что я пишу их не для себя или своих коллег, продираюсь через адские проблемы c версткой формул с хабровским wysiwyg, получается не всегда.
Что блять за комунити такое где все всё знают про все языки и паттерны, а элементарных вещей по комунити билдинг не понимают.
Вы говорите о том, что плохо закидывать камнями авторов, а через пару предложений закидываете камнями комментатора.
slonopotamus
02.02.2025 07:17Разумеется, туториалы - это следующий шаг после знакомства с самим языком.
Нет, не разумеется. Изучать что-то можно как от общего к частному, так и от частного к общему. От туториалов обычно ожидается второе. Но с вашими туториалами это не работает.
Если вы знакомы с функцией zoom из библиотеки lens - то в Я это контравариантный функтор из категории атрибутов (аналог линз) в категорию стрелок (функций) по первому параметру в State. И вместо функции zoom (которое является словом и имеет свои ассоциации), я могу использовать оператор ha (Hom-функтор, contrAvariant). Если этот абзац показался вам сложным, то мне правда нечего вам предложить и этот язык не для вас.
Возможно вы правы и я глуповат. А возможно вы слишком сложно объясняете простые вещи. Такое часто за хаскеллистами замечают. Как уже ставшее классикой "монада - это просто моноид в категории эндофункторов, чего тут непонятного". Или как Кнут, который для объяснения алгоритмов выдумывает вымышленный компьютер с вымышленным ассемблером. Я верю что можно было обойтись без этого, возможно даже получив большую лёгкость усвоения.
У вас есть This/That, которые вы определяете как left/right. А чем собсна сами по себе слова left/right не подошли?
Или Optional/Maybe/Halts. Есть хоть какая-то причина использовать три термина для одного и того же кроме повышения порога входа? Многие знают что такое Optional или Maybe. Уверен, гораздо меньше кто догадается что такое Halts, не прочитав его определение.
Что такое Forth? Не нашёл его описание нигде.
Почему вы называете типы, которые можно собрать из других типов, примитивами?
Кстати, в описании hv опечатка, должно быть
[V]oid
, а не[V]nit
.В общем возможно вы построили хорошую и прекрасную концепцию. Но очень старательно спрятали её за столькими порогами входа, через которые надо продраться, что кажется по дороге потеряли свою идею об уменьшении сложности.
iokasimov Автор
02.02.2025 07:17Нет, не разумеется. Изучать что-то можно как от общего к частному, так и от частного к общему. От туториалов обычно ожидается второе. Но с вашими туториалами это не работает.
Мне кажется, что ваши ожидания - это наверное всё таки ваши проблемы.
Возможно вы правы и я глуповат. А возможно вы слишком сложно объясняете простые вещи.
Дело не в глупости, а в знакомстве с определенными концепциями. Если вам это не интересно - это ваше дело, не понимаю, зачем вы мне ставите в упрёк то, чего вы не знаете и не собираетесь узнавать. Я использую для объяснений те концепции, который используется в самом языке, минуя промежуточные абстракции (которые всё равно потом отбросятся, когда вы попробуете понять фундамент).
монада - это просто моноид в категории эндофункторов, чего тут непонятного
Да, это известная шутка. Но я честно говоря не вижу ничего смешного в том, чтобы повторять то, чего ты не понимаешь и демонстративно отказываясь от этих знаний. Как если бы я одел очки и кривлялся в них перед теми, кто их носит.
Я не использую понятие монад в Я, вместо них используются естественные преобразования, из которых может получится монада - но это не обязательно.
Многие знают что такое Optional или Maybe. Уверен, гораздо меньше кто догадается что такое Halts, не прочитав его определение.
Ну наверное надо прочитать определение. Документация не полная, я не всё описал. Если чего-то нет в документации, можно заглянуть в код - это вполне нормальный процесс в программировании.
Кстати, в описании hv опечатка, должно быть
[V]oid
, а не[V]nit
.Спасибо, сейчас исправлю.
Но очень старательно спрятали её за столькими порогами входа, через которые надо продраться, что кажется по дороге потеряли свою идею об уменьшении сложности.
Вы сами устанавливаете себе порог. Вы прямо сейчас тратите своё драгоценное время на написание комментариев о том, что вы отказываетесь понимать фундамент, на котором строятся основы языка. Они на самом деле простые, но на них придётся потратить время, как и на изучение всего того, что вам до этого было не известно.
slonopotamus
02.02.2025 07:17Ну наверное надо прочитать определение.
Или надо удалить
Halts
, потому что оно ничего в язык не привносит, а только увеличивает когнитивную нагрузку и время изучения. Но я понял, уменьшение порога входа не входит в ваши цели.Мне кажется, что ваши ожидания - это наверное всё таки ваши проблемы.
Я думал вы запостили эту статью чтобы получить фидбек. Видимо нет. Ну как хотите. Хорошего вечера.
Kuch
02.02.2025 07:17Что такое монада?
CrazyOpossum
02.02.2025 07:17https://wiki.haskell.org/index.php?title=Monad_tutorials_timeline
Любая ссылка подойдётKuch
02.02.2025 07:17Не, так не интересно. Гуглить то я и сам умею, ну и в фп тоже. Хотел от автора объяснение услышать
rukhi7
02.02.2025 07:17to talk about what lies beyond the obscure term monad by starting with functors.
то есть монада это - the obscure term, если любая подойдет.
CrazyOpossum
02.02.2025 07:17Конечно, вы что SICP не читали?
rukhi7
02.02.2025 07:17даже если не читал - прочитать не проблема. На что вы советуете обратить внимание?
CrazyOpossum
02.02.2025 07:17На предисловие - про духов в машине и нас, пишущих заклинания. Мне по серьёзке трудно воспринимать вопрос про монады в комментариях под постом, который не все хаскеллисты понимают. То ли ирония, то ли человек дверью ошибся.
Если правда хотите понять о чём речь - советую начать с Milewski, Category Theory for Programmers. А про SICP шутка была, это что-то вроде библии функциональщиков - просветляет, вставляет, но немного про другое.IUIUIUIUIUIUIUI
02.02.2025 07:17«Монада» — это просто такой интерфейс, удовлетворяющий определённым законам, как «ассоциативный контейнер» или «итератор». Зачем человека сразу теоркатом грузить?
Zenitchik
02.02.2025 07:17"Монада" - это сущность, принципиально непостижимая человеком, который не привык программировать на функциональных языках программирования.
orenty7
02.02.2025 07:17Да нет же, любой кто хоть раз видел promise-ы (также известные как future), асинхронные функции или
flatMap
может понять что такое монада
gev
02.02.2025 07:17— Весь этот разговор довольно примитивен. Мы ведь начали с того, кто я по своей природе. Если угодно, я полагаю себя… Ну скажем, монадой. В терминах Лейбница.
— А кто тогда тот, кто полагает себя этой мандой?
— Монада и полагает, — ответил я, твердо решив держать себя в руках.
— Хорошо, — сказал Чапаев, хитро прищуриваясь, — насчет «кто» мы потом поговорим. А сейчас, друг милый, давай с «где» разберемся. Скажи-ка мне, где эта манда живет?
— В моем сознании.
— А сознание твое где?
— Вот здесь, — сказал я, постучав себя по голове.
;)
IUIUIUIUIUIUIUI
02.02.2025 07:17А ассоциативный контейнер — это сущность, принципиально непостижимая кем?
Zenitchik
02.02.2025 07:17Ассоциативный контейнер - это понятно. Но я не смог валидировать ваше утверждение, что монада является таковым. Где об этом можно прочитать?
IUIUIUIUIUIUIUI
02.02.2025 07:17Монаду можно определить так же (в смысле, плюс-минус тем же языком и на том же уровне абстракций), что и ассоциативные контейнеры. Процитирую себя из другого комментария:
Ассоциативный контейнер — это любая штука, в которую можно вставлять, искать и удалять, и для которой операции удовлетворяют ряду законов, вроде
lookup key (insert key value container) = Just value
илиinsert key v2 (insert key v1 container) = insert key v2 container
(тут есть тонкости с требованием дополнительных операций на типеkey
, но не будем вскрывать эту тему). Мапа — ассоциативный контейнер. Хэшмапа — тоже. Список пар — тоже. LRU-кэш — не ассоциативный контейнер, и вот почему: [...].Функтор — любая штука, у которой есть метод
map
с такой-то сигнатурой и удовлетворяющий законамmap id = id
,map g . map f = map (g . f)
. Список — функтор.Maybe
— функтор. Мапа с зафиксированным типом ключа — функтор. Скучный типdata Unit a = Unit
— функтор (тоже скучный).Монада I — любой функтор, у которого есть ещё две операции,
pure
иjoin,
с такими-то законами.Монада II — любой функтор, у которого есть ещё две операции,
pure
и>>=
, с такими-то законами.Монада I эквивалентна монаде II:
join
и>>=
взаимно выражаются, поэтому можно просто рассматривать понятие монады, пользуясь тем базисом, что удобнее в данный момент, но при этом достаточно определитьpure
и либоjoin
, либо>>=
. Список — монада.Maybe
— монада.ZipList
— не монада, и вот почему: [...].
gev
02.02.2025 07:17Самое лучше пояснение за монады, что я видел:
https://youtu.be/IkXg_mjNgG4?si=rFEzTHzc_J-dyRtq
Zenitchik
02.02.2025 07:17Я использую для объяснений те концепции, который используется в самом языке, минуя промежуточные абстракции
А это не то же самое, что рассказывать об английском на английском ацтеку?
iskateli
02.02.2025 07:17Избегать слов любой ценой
APL тоже пошел в сторону краткости синтаксиса и где он теперь? Там сам чёрт ногу сломит в этих значках. Зачем впадать в крайности, не понимаю.
IUIUIUIUIUIUIUI
02.02.2025 07:17Клавиатура заточена под ввод букв и цифр, а не вот этой вот вашей красоты.
Agda это успешно решает вводом закорючек через аккорды. Например, ≡ — это \==, а ≗ — \circeq.
Люди общаются между собой словами. Все эти значочки надо как-то называть (а значит слова будут)
В агде это тоже решается: люди вполне успешно описывают эти значочки терминами из предметной области, например.
Незнакомый с нотацией человек мало того что неспособен прочесть написанное, он даже не может нормально задать вопрос "что делает Х", потому что непонятно как назвать Х.
И это.
Что-то я подозреваю что гуглить это всё тоже окажется околоневозможно.
Да норм:
slonopotamus
02.02.2025 07:17Agda это успешно решает вводом закорючек через аккорды.
У вас очень много опечаток в фразе "Agda это решает через костыли".
Если бы на клавиатурах реально был символ ≗ (и у него было человеческое название), я был бы только за использовать его в программировании. Но вот это вот изобретение нотации в шарообоазном вакууме в отрыве от реального мира - спасибо, нет.
IUIUIUIUIUIUIUI
02.02.2025 07:17У вас очень много опечаток в фразе "Agda это решает через костыли".
Не нашёл ни одной, потому что написано то, что я и так хотел сказать.
Код пишется один раз, а читается много раз. Куда удобнее читать код, в котором не используются (визуальные) многозначковые комбинации или, чего хуже, слова, для тех вещей, для которых в предметной области есть устоявшаяся нотация.
У вас есть код
T-Abs : Γ ⊢[ θ ] τ₁ ⇒ τ₂ → Γ , τ₁ ⊢[ θ ] ε ⦂ τ₂ → Γ ⊢[ θ ] ƛ τ₁ ε ⦂ τ₁ ⇒ τ₂
где используются кастомные операторы и функции-закорючки, в порядке их появления — трёхместный
_⊢[_]_
(_
обозначает, куда идёт аргумент) и бинарный_⇒_
на первой строке; четырёхместный_⊢[_]_⦂_
и бинарный_,_
во второй строке, и бинарныйƛ
в третьей. Как бы вы написали это обычными словами, чтобы это можно было прочитать?Если бы на клавиатурах реально был символ ≗
Одна из причин мне использовать эргодокс со слоями. Греческие буквы и наиболее частые символы я повесил на отдельные слои.
и у него было человеческое название
Поточечное пропозициональное равенство двух функций.
Но вот это вот изобретение нотации в шарообоазном вакууме в отрыве от реального мира - спасибо, нет.
Ох уж этот реальный мир и отсылки к нему, когда по реальным миром каждый понимает что-то своё.
в риальном мире так та и матиматика ненужна, и вуз, и дажи старшые классы школы. чаивые калькулятар пащитает, а граматнаст тоже ненужна ведь вы этоттекст тоже можите прачитать и панять што яимел ввиду
slonopotamus
02.02.2025 07:17У вас есть код
Половина того что вы написали на моём телефоне выглядит как квадратики. К вопросу об игнорировании реальности. И автору в статье тоже приходится вставлять код скриншотами.
ведь вы этоттекст тоже можите прачитать и панять што яимел ввиду
Ох уж этот максимализм... А у вас нет каких-то промежуточных вариантов между греческим и падонкафским?
Одна из причин мне использовать эргодокс со слоями.
Вы можете хоть при помощи вибратора с рулём код писать. Но никакой бизнес на это завязываться не будет.
IUIUIUIUIUIUIUI
02.02.2025 07:17Половина того что вы написали на моём телефоне выглядит как квадратики. К вопросу об игнорировании реальности.
А вы с телефона пишете код или проводите ревью?
Заодно там ширину строк под телефон (учитывая засилье вертикальных видео — в вертикальной ориентации) адаптировать не нужно?
Ох уж этот максимализм...
Не максимализм, а демонстрация, что слова про реальный мир — это не аргумент, потому что им мы приходим к очевидно бредовым выводам.
Вы можете хоть при помощи вибратора с рулём код писать. Но никакой бизнес на это завязываться не будет.
Пойду расскажу об этом бизнесам, которые за агду платили.
slonopotamus
02.02.2025 07:17А вы с телефона пишете код или проводите ревью?
Ревью делаю, а что?
IUIUIUIUIUIUIUI
02.02.2025 07:17Ширину строк в кодстайле/линтере сделали такой, чтобы side-by-side-дифф влезал на экран? Или, может, удобство работы с мобильника не является ключевым фактором для кодингового окружения?
У меня были работы, где весь кодинг шёл через RDP на серверах где-то там, для доступа к чему надо было приложить палец к yubikey, вставленному в usb-порт. Код (и ревью, и прочее) у меня с мобилы не открывался вообще никак, ни квадратиками, ни вопросиками. Я правильно понимаю, что RDP — непригодная технология, и никакой бизнес на неё завязываться не будет?
Но это риторические вопросы. Нериторический, серьёзный вопрос другой: какая альтернатива? Как бы вы написали выражение выше, чтобы без закорючек?
slonopotamus
02.02.2025 07:17Да чо вы за мобильник зацепились. Открыл на линукс-десктопе, тоже квадратики.
Нериторический, серьёзный вопрос другой: какая альтернатива? Как бы вы написали выражение выше, чтобы без закорючек?
Не знаю. Об этом надо много думать, я не позиционирую себя как дизайнер языков программирования. Но не надо быть поваром чтобы понять что борщ недосолен.
IUIUIUIUIUIUIUI
02.02.2025 07:17Открыл на линукс-десктопе, тоже квадратики.
ХЗ, у меня с fira code всё работает.
А вот код на go, например, у меня тоже не заведётся за отсутствием компилятора go.
Не знаю. Об этом надо много думать, я не позиционирую себя как дизайнер языков программирования.
Ну вот оказывается, что во всех языках, которые претендуют на хотя бы возможность формализации таких вещей и которые при этом успешны на этом поприще, есть возможность (и культура) работы с закорючками, кастомные миксфиксные операторы (вот эти все трёх-четырёх-пятиместные штуки с подчёркиваниями), и так далее. Много разных людей думало и не придумало ничего лучше.
Но не надо быть поваром чтобы понять что борщ недосолен.
У всех аналогий есть границы применимости, и у этой тоже.
slonopotamus
02.02.2025 07:17у меня с fira code всё работает
Да, я понял, вы как и автор статьи безусловно всегда на 100% правы. А если у кого-то ваш подход вызывает трудности, то проблема всегда на их стороне, а вы д'Артаньян.
IUIUIUIUIUIUIUI
02.02.2025 07:17Нет, конечно. Просто альтернативы ещё хуже.
А говорить, что (разовая, имеющая константную сложность) подготовка окружения к работе с каким-то инструментом — это недостаток инструмента, очень странно. Тогда все инструменты отстой и не готовы для бизнеса, потому что для всех инструментов нужно готовиться. Даже для программирования в машинных кодах надо хекс-редактор поставить.
Ну либо остаться на машинах, где весь интерфейс сводился к тумблерам на передней панели — там ничего ставить и готовиться не надо, идеальные машины, только бизнес тупой и слез с них почему-то.
slonopotamus
02.02.2025 07:17Сами по себе закорючки возможно были бы ок, если бы был нормальный способ их вводить. Если бы был нормальный способ писать текст в трёх-пяти измерениях, может ваши закорючки выглядели бы отсталым средневековьем на фоне того что можно творить. Но когда начинается ha'yo'he - это костыли и кривая попытка игнорировать ограничения реального мира.
IUIUIUIUIUIUIUI
02.02.2025 07:17Сами по себе закорючки возможно были бы ок, если бы был нормальный способ их вводить.
Ненормальный способ их вводить — это, условно, тыкать по экранной клавиатуре. Я не вижу существенных проблем с упомянутым выше способом, когда равенство из трёх горизонтальных палочек — это просто два знака равно подряд.
Слои на эргодоксе — ещё удобнее. Для определённой задачи определённые инструменты повышают удобство ⇒ я покупаю этот инструмент и овладеваю им. А с вашей точки зрения ни один бизнес никогда бы не завязался на аппсторы и производство приложений для них, потому что там нужно купить макбук (сильно дороже эргодокса) и получить полный вендорлок на конкретную экосистемы.
А способов ввода текстов в пяти измерениях нет вообще, никаких.
orenty7
02.02.2025 07:17Агда очень костыльная в этом плане. Во-первых набор символов сильно ограничен по сравнению с техом, во-вторых нужно искать шрифты поддерживающие закорючки. У Isabelle/HOL, насколько я знаю, в тексте обычные символы, а в редакторе они отображаются как закорючки. Такой подход, кмк, сильно лучше агдовского
IUIUIUIUIUIUIUI
02.02.2025 07:17Ну хз. Шрифты с закорючками всё равно нужны (а то как их редактор рисует-то?), аккорды вводить всё равно нужно (просто они не автозаменяются на уникодные символы), но при этом вне редактора (на гитхабе, например) приходётся читать неформатированный латех. По-моему, это строго нелучше и по некоторым аспектам хуже.
Во-первых набор символов сильно ограничен по сравнению с техом
Можно добавлять нужные, но отсутствующие в ваш редактор! Агде ж всё равно, она любой уникод жрёт.
orenty7
02.02.2025 07:17Шрифты с закорючками всё равно нужны (а то как их редактор рисует-то?)
У меня была проблема не столько с самими закорючками, сколько с их размещением. У юникода множество сабскриптов очень ограниченно. Например
в агде уже не написать, потому что в юникоде нет символа
.
Можно добавлять нужные, но отсутствующие в ваш редактор! Агде ж всё равно, она любой уникод жрёт.
Можешь привести какой-то пример? Я, кажется, не совсем понимаю что имеется ввиду
IUIUIUIUIUIUIUI
02.02.2025 07:17Например
в агде уже не написать, потому что в юникоде нет символа
.
Это на самом деле тоже раздражает, но между кастомным рендерером в редакторе (что заодно привязывает меня к редактору — вряд ли nvim так же умеет) и ограничением в индексах я скорее выберу второе.
Можешь привести какой-то пример? Я, кажется, не совсем понимаю что имеется ввиду
Можно сюда добавлять всякое по желанию.
Ну или у меня самописный плагин для nvim'а — там тоже просто в файл добавляешь новые сочетания, и всё.
slonopotamus
02.02.2025 07:17эти операторы забирают на себя одну из самых сложных аспектов в программировании - порядок вычислений
В большинстве языков программирования вычисления выполняются в том порядке, в котором они записаны в коде, и вообще никакой сложности в этом нет.
iokasimov Автор
02.02.2025 07:17Я и не подозревал, что всё на самом деле так просто! Ни ветвлений, ни условий, ни прыжков в другие участки кода. Просто инструкции, одна за другой...
slonopotamus
02.02.2025 07:17Читаем сверху вниз, как дошли до jmp - прыгаем в соответствующее место, продолжаем читать сверху-вниз. Да с этим даже дети справляются (см какой-нибудь Scratch).
Вот читать мейкфайл например куда сложнее, потому что надо пройти по зависимостям, собрать весь граф, а потом развернуть его задом наперёд.
iokasimov Автор
02.02.2025 07:17Да с этим даже дети справляются
Вопрос не в том, кто с этим справляется, а в том, что control flow может быть достаточно сложен и один из лучших способов сделать его легче - это декларативность. А вот запускать интерпретатор в своей голове, пытаясь разобраться что происходит с такими
jmp
- может и оперативной памяти не хватить.Я не совсем понимаю, к чему эти конкретные примеры - как это вообще к это теме этой статьи относится?
Даже взрослые еле справляются со сложными control flow. Я лишь предлагаю свой подход к решению этой проблемы. Он может вам не нравится, но это ваше дело и вы можете критиковать его, просто хотелось бы больше конструктивности.
IUIUIUIUIUIUIUI
02.02.2025 07:17В большинстве языков программирования вычисления выполняются в том порядке, в котором они записаны в коде, и вообще никакой сложности в этом нет.
Как в C отличается порядок выполнения
str && str[0] == 'a'
противstr & str[0] == 'a'
?slonopotamus
02.02.2025 07:17Вы знаете ответ, никак, это придётся просто запомнить. Впрочем, я и не настаиваю что моё утверждение применимо ко всем языкам. И у C есть куча недостатков и кривых решений (зачем вообще над указателем можно делать
&
я не знаю).IUIUIUIUIUIUIUI
02.02.2025 07:17Вы знаете ответ, никак, это придётся просто запомнить. Впрочем, я и не настаиваю что моё утверждение применимо ко всем языкам.
Подобный костыльный short-circuiting есть во всех¹ императивных языках, и подобная разница есть везде¹, где есть заодно и битовые операторы. Плюс, он действительно костыльный: например, в плюсах
&&
коротит только для встроенных типов, и свои short-circuiting-операторы вы определять не можете нигде¹.¹ из тех языков, про которые я хоть что-то достаточно знаю, конечно
И у C есть куча недостатков и кривых решений (зачем вообще над указателем можно делать
&
я не знаю).Я мог бы написать
(bool)str
, суть это меняет не сильно.Но вообще затем, зачем над указателями вообще делать битовую арифметику: чтобы в младших (или старших) битиках там что-нибудь хранить. Во всяких локфри бывает полезно, да и вообще память экономит, так как указатели выровнены, и эти битики пропадают (а старшие на x86_64 не используются).
slonopotamus
02.02.2025 07:17чтобы в младших (или старших) битиках там что-нибудь хранить
Чот мне кажется это UB.
IUIUIUIUIUIUIUI
02.02.2025 07:17Когда настоящего сишника это останавливало?
Но вообще записать что-то в младший битик указателя, а потом вернуть всё обратно перед использованием — вроде как не UB. С pointer provenance ерунда будет, вероятно, но у меня есть чувство, что pointer provenance не понимает даже Комитет.
metamath
02.02.2025 07:17Это серая зона. Формально UB до C++23, но по весьма забавной причине: из-за сборщика мусора. На который никто обычно никак не рассчитывает при написании C++ кода, но возможность наличия которого учтена в стандарте. Источник: https://pvs-studio.ru/ru/blog/posts/cpp/1178/
usrsse2
02.02.2025 07:17А причём тут С++23, речь идёт про C, а не C++.
slonopotamus
02.02.2025 07:17Мне пишут что в C это тоже UB.
metamath
02.02.2025 07:17Ну если не перегонять в
uintptr_t
, то конечно это UB везде. Но перегнать-то несложно.
UwUMursik
02.02.2025 07:17Занимательно. А для каких задач данный язык существует? Или с какими задачами он в теории лучше справляется, чем некоторые другие?
vadimr
02.02.2025 07:17Людям с аудиальным типом восприятия очень некомфортно работать с такими значками. Конечно, жизнь заставит родиться в Китае - выучишь иероглифы, но в целом пример языка APL показывает, что это тупиковый путь. Семантика APL была востребована и нашла своё развитие в современном Фортране и Матлабе, а синтаксис нет.
iokasimov Автор
02.02.2025 07:17Судя по вашей логике, то таким людям и читать текст некомфортно. Я пока не знаю примеров языков программирования, оторванных от текста.
vadimr
02.02.2025 07:17Буквенный текст имеет фонетическое представление, и большинство программ вполне нормально воспринимаются внутренним слухом (кроме извращений вроде значащих отступов в питоне, которые многие проклинают в том числе и по этой причине).
Представьте, как музыкант читает ноты. Для меня, например, это похоже на программу.
iokasimov Автор
02.02.2025 07:17Так все операторы в
Я
так же можно произнести, ведь они состоят из букв латинского алфавита. Тут всё описано: https://muratkasimov.art/Ya/Operators
slonopotamus
02.02.2025 07:17Автор предлагает вам учить кружочки. После этого вы сможете их читать как hi/ho/ha/he/hu. Удобно?
starwalkn
02.02.2025 07:17Интересный у вас шрифт используется, не поделитесь названием?
iokasimov Автор
02.02.2025 07:17"Кодама". Я его так назвал, так как я не создавал этот шрифт с нуля, я взял Mononoki, изменил некоторые базовые символы и добавил автоматическую генерацию композитных лигатур. Мне это напоминило мультфильм "Принцесса Мононоке", там были такие создания, их звали Кодама и они своими телами похожи на операторы в Я. Вот тут его можно скачать.
starwalkn
02.02.2025 07:17И получилось довольно интересно. Ваш вариант куда-то выложен или только для личного пользования?
Cdracm
02.02.2025 07:17yokl
- [Y]oneda c[O]variant [K]eisli K[L]eisli операторА, ну тогда все понятно, спасибо
rukhi7
а то что "удаляет определенный элемент" это значит удаляет именно определенный, то есть точно идентифицированный в списке элемент по индексу например, а filter это функция которая возвращает список этих ID (индексов например) разве не будет проще??? Просто не путать назначения функций и/или смысл слов, разве не проще???
Еще раз убеждаюсь что ФП это
способ борьбы со сложностью методом увеличения сложности. Наверно потому что если сложность не привнести то вроде как и бороться не с чем.
iokasimov Автор
Мне кажется, вы прочитали только первое предложение в абзаце, речь идёт не об индексах.
rukhi7