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

Основная логика программы, определяющей сбалансированность расставленных скобок
Основная логика программы, определяющей сбалансированность расставленных скобок

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

Обработчик выражений обратной польской записи
Обработчик выражений обратной польской записи

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

Преобразование ввода как символа в команду для изменения графического интерфейса
Преобразование ввода как символа в команду для изменения графического интерфейса

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

Все интерфейсы должны быть открытыми

Я не считаю инженеров детьми, от которых нужно скрывать детали реализации. Они способны находить применение и выворачивать всё наизнанку - так пускай так и делают, попутно находя новые решения, там где их не видел первоначальный создатель. Вы скрываете детали, потому что зачастую они невероятно уродливы и в них крайне тяжело разобраться (иначе бы их не называли "кишками").

Абсолютно всё можно изменить

С помощью естественных преобразований можно изменить любые объекты/эффекты/примитивы. Можно повлиять на вход/выход функций/атрибутов, изменять область видимости состояния, трансформировать одни структуры данных в другие, разъединять/объединять эффекты между собой.

Избегать слов любой ценой

Каждое слово несёт за собой множество смыслов и длинный шлейф ассоциаций. Поэтому сами слова нужно использовать по-минимуму и они должны иметь как можно чёткие определения. Скажем, я хочу написать функцию remove, которая удаляет определенный элемент из списка. Должна ли она обойти весь список и удалить все совпадения с образцом или же остановится на первом сопоставлении? Тогда чем она отличается от filter? Что если я хочу, чтобы сопоставление с образцом было более умудрённым? Удалить первые 4 элемента, соответствующих определенному условию. Или чтобы я за условиями обращался куда-нибудь во внешний мир. Как только таких простых функций недостаточно, приходится писать новые.

Расчёт объемов воды, застрявшей между столбиками
Расчёт объемов воды, застрявшей между столбиками

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

Распределение вероятностей нахождения корабля на доске для игры в морской бой
Распределение вероятностей нахождения корабля на доске для игры в морской бой

По сути, Я - это eDSL в Haskell. Он содержит в себе чистую корневую библиотеку (без зависимостей, даже нет base); другие библиотеки (работа с консолью, ASCII-символы); и специальный шрифт, который преобразовывает определенную последовательность символов в лигатуры (тестировалось в Visal Studio Code).

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

Я оставлю несколько ссылок ниже, если у вас есть вопросы (кроме того, зачем нужен ещё один язык программирования) - не стесняйтесь задавать.

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

Документация | Пробное видео с Hello, Word! | Репозиторий с примерами | Твиттер

Комментарии (56)


  1. rukhi7
    02.02.2025 07:17

    Скажем, я хочу написать функцию remove, которая удаляет определенный элемент из списка. Должна ли она обойти весь список и удалить все совпадения с образцом или же остановится на первом сопоставлении? Тогда чем она отличается от filter? Что если я хочу, чтобы сопоставление с образцом было более умудрённым? Удалить первые 4 элемента, соответствующих определенному условию. Или чтобы я за условиями обращался куда-нибудь во внешний мир. Как только таких простых функций недостаточно, приходится писать новые.

    а то что "удаляет определенный элемент" это значит удаляет именно определенный, то есть точно идентифицированный в списке элемент по индексу например, а filter это функция которая возвращает список этих ID (индексов например) разве не будет проще??? Просто не путать назначения функций и/или смысл слов, разве не проще???

    Еще раз убеждаюсь что ФП это

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

    способ борьбы со сложностью методом увеличения сложности. Наверно потому что если сложность не привнести то вроде как и бороться не с чем.


    1. iokasimov Автор
      02.02.2025 07:17

      по индексу например

      Мне кажется, вы прочитали только первое предложение в абзаце, речь идёт не об индексах.


      1. rukhi7
        02.02.2025 07:17

        filter это функция которая возвращает список этих ID (индексов например)


  1. slonopotamus
    02.02.2025 07:17

    Избегать слов любой ценой

    Тут есть проблемки.

    1. Клавиатура заточена под ввод букв и цифр, а не вот этой вот вашей красоты.

    2. Люди общаются между собой словами. Все эти значочки надо как-то называть (а значит слова будут)

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

    4. Что-то я подозреваю что гуглить это всё тоже окажется околоневозможно.

    Поэтому всё что я пытаюсь сделать в Я - это отодвинуть компромисс между простотой использования и обобщенностью концепций ещё дальше

    В смысле, ещё сложнее использовать чем Haskell?

    P.S. Посмотрел ваши туториалы. По ним понять решительно ничего невозможно.


    1. iokasimov Автор
      02.02.2025 07:17

      P.S. Посмотрел ваши туториалы. По ним понять решительно ничего невозможно.

      Разумеется, туториалы - это следующий шаг после знакомства с самим языком. Вроде никто обычно не жалуется, что не может понять код на языке, которого он не знает. Это нормально. У вас просто не получится с наскока со всем разобраться, минуя фундамент.

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

      2. Всё так, можно либо объяснять код, используя слова из предметной области либо самими операторами. В самом Haskell вроде как у <*> нет своего названия, но ничего - люди как-то пользуются.

      3. Нотация там несложная, нужно просто прочитать страничку с операторами и всё станет на свои места. Но как я уже и говорил ранее, это нормально, что человек, не знающий языка не может его прочитать. Если под читаемостью подразумевается именно С-подобный синтаксис - тогда я могу понять.

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

      В смысле, ещё сложнее использовать чем Haskell?

      Я не могу сказать, что использовать Haskell сложно. Для меня это один из самых лёгких языков программирования с ясной семантикой и предсказуемым поведением. Под "отодвиганием компромиса" имеется ввиду обобщение базовых конструкций в стандартном Haskell.

      Если вы знакомы с функцией zoom из библиотеки lens - то в Я это контравариантный функтор из категории атрибутов (аналог линз) в категорию стрелок (функций) по первому параметру в State. И вместо функции zoom (которое является словом и имеет свои ассоциации), я могу использовать оператор ha (Hom-функтор, contrAvariant). Если этот абзац показался вам сложным, то мне правда нечего вам предложить и этот язык не для вас. Но если вас вдруг заинтересовало, то я могу помочь разобрать и другие аспекты этого языка.


      1. CrazyOpossum
        02.02.2025 07:17

        Всё так, можно либо объяснять код, используя слова из предметной области либо самими операторами. В самом Haskell вроде как у <$> нет своего названия, но ничего - люди как-то пользуются.

        Инфиксный map/fmap. А >>= это bind. Вопрос даже не в словах, а можно ли это хуглить.


        1. iokasimov Автор
          02.02.2025 07:17

          У меня не получается объяснить, что операторы в Я не надо гуглить - их надо читать. Они состоят из логографических токенов и объясняют, что они делают. Нет нужды к каждому инфиксному оператору добавлять синоним (bind, traverse), только для того, чтобы его запоминать. Вот тут всё объясняется, как это работает: https://muratkasimov.art/Ya/Operators


      1. 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.

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


        1. iokasimov Автор
          02.02.2025 07:17

          Нет, не разумеется. Изучать что-то можно как от общего к частному, так и от частного к общему. От туториалов обычно ожидается второе. Но с вашими туториалами это не работает.

          Мне кажется, что ваши ожидания - это наверное всё таки ваши проблемы.

          Возможно вы правы и я глуповат. А возможно вы слишком сложно объясняете простые вещи.

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

          монада - это просто моноид в категории эндофункторов, чего тут непонятного

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

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

          Многие знают что такое Optional или Maybe. Уверен, гораздо меньше кто догадается что такое Halts, не прочитав его определение.

          Ну наверное надо прочитать определение. Документация не полная, я не всё описал. Если чего-то нет в документации, можно заглянуть в код - это вполне нормальный процесс в программировании.

          Кстати, в описании hv опечатка, должно быть [V]oid, а не [V]nit.

          Спасибо, сейчас исправлю.

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

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


          1. slonopotamus
            02.02.2025 07:17

            Ну наверное надо прочитать определение.

            Или надо удалить Halts, потому что оно ничего в язык не привносит, а только увеличивает когнитивную нагрузку и время изучения. Но я понял, уменьшение порога входа не входит в ваши цели.

            Мне кажется, что ваши ожидания - это наверное всё таки ваши проблемы.

            Я думал вы запостили эту статью чтобы получить фидбек. Видимо нет. Ну как хотите. Хорошего вечера.


          1. Kuch
            02.02.2025 07:17

            Что такое монада?


    1. iskateli
      02.02.2025 07:17

      Избегать слов любой ценой
      APL тоже пошел в сторону краткости синтаксиса и где он теперь? Там сам чёрт ногу сломит в этих значках. Зачем впадать в крайности, не понимаю.


    1. IUIUIUIUIUIUIUI
      02.02.2025 07:17

      Клавиатура заточена под ввод букв и цифр, а не вот этой вот вашей красоты.

      Agda это успешно решает вводом закорючек через аккорды. Например, ≡ — это \==, а ≗ — \circeq.

      Люди общаются между собой словами. Все эти значочки надо как-то называть (а значит слова будут)

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

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

      И это.

      Что-то я подозреваю что гуглить это всё тоже окажется околоневозможно.

      Да норм:


      1. slonopotamus
        02.02.2025 07:17

        Agda это успешно решает вводом закорючек через аккорды.

        У вас очень много опечаток в фразе "Agda это решает через костыли".

        Если бы на клавиатурах реально был символ ≗ (и у него было человеческое название), я был бы только за использовать его в программировании. Но вот это вот изобретение нотации в шарообоазном вакууме в отрыве от реального мира - спасибо, нет.


        1. IUIUIUIUIUIUIUI
          02.02.2025 07:17

          У вас очень много опечаток в фразе "Agda это решает через костыли".

          Не нашёл ни одной, потому что написано то, что я и так хотел сказать.

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

          У вас есть код

            T-Abs : Γ ⊢[ θ ] τ₁ ⇒ τ₂
                  → Γ , τ₁ ⊢[ θ ] ε ⦂ τ₂
                  → Γ ⊢[ θ ] ƛ τ₁ ε ⦂ τ₁ ⇒ τ₂

          где используются кастомные операторы и функции-закорючки, в порядке их появления — трёхместный _⊢[_]_ (_ обозначает, куда идёт аргумент) и бинарный _⇒_ на первой строке; четырёхместный _⊢[_]_⦂_ и бинарный _,_ во второй строке, и бинарный ƛ в третьей. Как бы вы написали это обычными словами, чтобы это можно было прочитать?

          Если бы на клавиатурах реально был символ ≗

          Одна из причин мне использовать эргодокс со слоями. Греческие буквы и наиболее частые символы я повесил на отдельные слои.

          и у него было человеческое название

          Поточечное пропозициональное равенство двух функций.

          Но вот это вот изобретение нотации в шарообоазном вакууме в отрыве от реального мира - спасибо, нет.

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

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


          1. slonopotamus
            02.02.2025 07:17

            У вас есть код

            Половина того что вы написали на моём телефоне выглядит как квадратики. К вопросу об игнорировании реальности. И автору в статье тоже приходится вставлять код скриншотами.

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

            Ох уж этот максимализм... А у вас нет каких-то промежуточных вариантов между греческим и падонкафским?

            Одна из причин мне использовать эргодокс со слоями.

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


            1. IUIUIUIUIUIUIUI
              02.02.2025 07:17

              Половина того что вы написали на моём телефоне выглядит как квадратики. К вопросу об игнорировании реальности.

              А вы с телефона пишете код или проводите ревью?

              Заодно там ширину строк под телефон (учитывая засилье вертикальных видео — в вертикальной ориентации) адаптировать не нужно?

              Ох уж этот максимализм...

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

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

              Пойду расскажу об этом бизнесам, которые за агду платили.


              1. slonopotamus
                02.02.2025 07:17

                А вы с телефона пишете код или проводите ревью?

                Ревью делаю, а что?


                1. IUIUIUIUIUIUIUI
                  02.02.2025 07:17

                  Ширину строк в кодстайле/линтере сделали такой, чтобы side-by-side-дифф влезал на экран? Или, может, удобство работы с мобильника не является ключевым фактором для кодингового окружения?

                  У меня были работы, где весь кодинг шёл через RDP на серверах где-то там, для доступа к чему надо было приложить палец к yubikey, вставленному в usb-порт. Код (и ревью, и прочее) у меня с мобилы не открывался вообще никак, ни квадратиками, ни вопросиками. Я правильно понимаю, что RDP — непригодная технология, и никакой бизнес на неё завязываться не будет?

                  Но это риторические вопросы. Нериторический, серьёзный вопрос другой: какая альтернатива? Как бы вы написали выражение выше, чтобы без закорючек?


                  1. slonopotamus
                    02.02.2025 07:17

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

                    Нериторический, серьёзный вопрос другой: какая альтернатива? Как бы вы написали выражение выше, чтобы без закорючек?

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


                    1. IUIUIUIUIUIUIUI
                      02.02.2025 07:17

                      Открыл на линукс-десктопе, тоже квадратики.

                      ХЗ, у меня с fira code всё работает.

                      А вот код на go, например, у меня тоже не заведётся за отсутствием компилятора go.

                      Не знаю. Об этом надо много думать, я не позиционирую себя как дизайнер языков программирования.

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

                      Но не надо быть поваром чтобы понять что борщ недосолен.

                      У всех аналогий есть границы применимости, и у этой тоже.


                      1. slonopotamus
                        02.02.2025 07:17

                        у меня с fira code всё работает

                        Да, я понял, вы как и автор статьи безусловно всегда на 100% правы. А если у кого-то ваш подход вызывает трудности, то проблема всегда на их стороне, а вы д'Артаньян.


                      1. IUIUIUIUIUIUIUI
                        02.02.2025 07:17

                        Нет, конечно. Просто альтернативы ещё хуже.

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

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


          1. slonopotamus
            02.02.2025 07:17

            Сами по себе закорючки возможно были бы ок, если бы был нормальный способ их вводить. Если бы был нормальный способ писать текст в трёх-пяти измерениях, может ваши закорючки выглядели бы отсталым средневековьем на фоне того что можно творить. Но когда начинается ha'yo'he - это костыли и кривая попытка игнорировать ограничения реального мира.


            1. IUIUIUIUIUIUIUI
              02.02.2025 07:17

              Сами по себе закорючки возможно были бы ок, если бы был нормальный способ их вводить.

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

              Слои на эргодоксе — ещё удобнее. Для определённой задачи определённые инструменты повышают удобство ⇒ я покупаю этот инструмент и овладеваю им. А с вашей точки зрения ни один бизнес никогда бы не завязался на аппсторы и производство приложений для них, потому что там нужно купить макбук (сильно дороже эргодокса) и получить полный вендорлок на конкретную экосистемы.

              А способов ввода текстов в пяти измерениях нет вообще, никаких.


      1. orenty7
        02.02.2025 07:17

        Агда очень костыльная в этом плане. Во-первых набор символов сильно ограничен по сравнению с техом, во-вторых нужно искать шрифты поддерживающие закорючки. У Isabelle/HOL, насколько я знаю, в тексте обычные символы, а в редакторе они отображаются как закорючки. Такой подход, кмк, сильно лучше агдовского


        1. IUIUIUIUIUIUIUI
          02.02.2025 07:17

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

          Во-первых набор символов сильно ограничен по сравнению с техом

          Можно добавлять нужные, но отсутствующие в ваш редактор! Агде ж всё равно, она любой уникод жрёт.


  1. slonopotamus
    02.02.2025 07:17

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

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


    1. iokasimov Автор
      02.02.2025 07:17

      Я и не подозревал, что всё на самом деле так просто! Ни ветвлений, ни условий, ни прыжков в другие участки кода. Просто инструкции, одна за другой...

      https://ru.wikipedia.org/wiki/Порядок_выполнения


      1. slonopotamus
        02.02.2025 07:17

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

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


        1. iokasimov Автор
          02.02.2025 07:17

          Да с этим даже дети справляются

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

          Я не совсем понимаю, к чему эти конкретные примеры - как это вообще к это теме этой статьи относится?

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


    1. IUIUIUIUIUIUIUI
      02.02.2025 07:17

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

      Как в C отличается порядок выполнения str && str[0] == 'a' против str & str[0] == 'a'?


      1. slonopotamus
        02.02.2025 07:17

        Вы знаете ответ, никак, это придётся просто запомнить. Впрочем, я и не настаиваю что моё утверждение применимо ко всем языкам. И у C есть куча недостатков и кривых решений (зачем вообще над указателем можно делать & я не знаю).


        1. IUIUIUIUIUIUIUI
          02.02.2025 07:17

          Вы знаете ответ, никак, это придётся просто запомнить. Впрочем, я и не настаиваю что моё утверждение применимо ко всем языкам.

          Подобный костыльный short-circuiting есть во всех¹ императивных языках, и подобная разница есть везде¹, где есть заодно и битовые операторы. Плюс, он действительно костыльный: например, в плюсах && коротит только для встроенных типов, и свои short-circuiting-операторы вы определять не можете нигде¹.

          ¹ из тех языков, про которые я хоть что-то достаточно знаю, конечно

          И у C есть куча недостатков и кривых решений (зачем вообще над указателем можно делать & я не знаю).

          Я мог бы написать (bool)str, суть это меняет не сильно.

          Но вообще затем, зачем над указателями вообще делать битовую арифметику: чтобы в младших (или старших) битиках там что-нибудь хранить. Во всяких локфри бывает полезно, да и вообще память экономит, так как указатели выровнены, и эти битики пропадают (а старшие на x86_64 не используются).


          1. slonopotamus
            02.02.2025 07:17

            чтобы в младших (или старших) битиках там что-нибудь хранить

            Чот мне кажется это UB.


            1. IUIUIUIUIUIUIUI
              02.02.2025 07:17

              Когда настоящего сишника это останавливало?

              Но вообще записать что-то в младший битик указателя, а потом вернуть всё обратно перед использованием — вроде как не UB. С pointer provenance ерунда будет, вероятно, но у меня есть чувство, что pointer provenance не понимает даже Комитет.


            1. metamath
              02.02.2025 07:17

              Это серая зона. Формально UB до C++23, но по весьма забавной причине: из-за сборщика мусора. На который никто обычно никак не рассчитывает при написании C++ кода, но возможность наличия которого учтена в стандарте. Источник: https://pvs-studio.ru/ru/blog/posts/cpp/1178/


  1. UwUMursik
    02.02.2025 07:17

    Занимательно. А для каких задач данный язык существует? Или с какими задачами он в теории лучше справляется, чем некоторые другие?


    1. iokasimov Автор
      02.02.2025 07:17

      Там где есть сложный порядок выполнения. Компиляторы, утилиты, агенты - навскидку. Использовать в вебе как и Haskell (на мой взгляд) смысла особого нет.


  1. vadimr
    02.02.2025 07:17

    Людям с аудиальным типом восприятия очень некомфортно работать с такими значками. Конечно, жизнь заставит родиться в Китае - выучишь иероглифы, но в целом пример языка APL показывает, что это тупиковый путь. Семантика APL была востребована и нашла своё развитие в современном Фортране и Матлабе, а синтаксис нет.


    1. iokasimov Автор
      02.02.2025 07:17

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


      1. vadimr
        02.02.2025 07:17

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

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


        1. iokasimov Автор
          02.02.2025 07:17

          Так все операторы в Я так же можно произнести, ведь они состоят из букв латинского алфавита. Тут всё описано: https://muratkasimov.art/Ya/Operators


        1. slonopotamus
          02.02.2025 07:17

          Автор предлагает вам учить кружочки. После этого вы сможете их читать как hi/ho/ha/he/hu. Удобно?


  1. starwalkn
    02.02.2025 07:17

    Интересный у вас шрифт используется, не поделитесь названием?


    1. iokasimov Автор
      02.02.2025 07:17

      "Кодама". Я его так назвал, так как я не создавал этот шрифт с нуля, я взял Mononoki, изменил некоторые базовые символы и добавил автоматическую генерацию композитных лигатур. Мне это напоминило мультфильм "Принцесса Мононоке", там были такие создания, их звали Кодама и они своими телами похожи на операторы в Я. Вот тут его можно скачать.


      1. starwalkn
        02.02.2025 07:17

        И получилось довольно интересно. Ваш вариант куда-то выложен или только для личного пользования?


  1. Teashrock
    02.02.2025 07:17

    Я

    Так Вы и есть язык программирования?


  1. Cdracm
    02.02.2025 07:17

    yokl - [Y]oneda c[O]variant [K]eisli K[L]eisli оператор

    А, ну тогда все понятно, спасибо