Эльфийский язык программирования

    Как известно, если ты серьёзный программист, синтаксический сахар тебе не нужен, это баловство. Ещё несколько лет назад Python считался детской погремушкой именно из за этого. Чем вам фигурные скобки мешали? Ребячество какое-то придумали: заменить фигурные скобки на отступы табуляции. Сказал солидный дядя. Маличики согласно покивали, виновато глядя в потолок. Через год все работали в коллективах где Питон основной язык.

    Правильное развитие языков какое? А вот какое. Берётся паттерн программирования, который применяется в нынешнем языке, и делается попытка внедрить этот паттерн на уровне самого языка в уже новом языке. То есть жила-была функция без имени, вы её называли лямбда, может быть даже имя было, но оно было не нужно вам, просто компилятор требовал, ну называли «f1», а в новом языке это сразу — лямбда! Или был массив, вы как то ограничивали его длину и состав, и как следствие называли его кортежем, а теперь, вуаля, он у вас сразу — кортеж и удобнее пользоваться. Использовали вы отложенные расчёты сложно ухищраясь на С++, а теперь — бамс! и у вас прямо на уровне языка то же самое, называется lazy eval, только с монадами осторожнее, Люк. А что такое монады, мастер Йода? Ой всё!

    Подразумевается, что если ты используешь такой новый язык, то ты уже обязан ЗНАТЬ эти паттерны и уметь их применять. Повышается репутация и рыночное преимущество уже от того, что в си-ви написано название языка содержащего новую семантику ассоциирующуюся у сообщества с лучшими достижениями. С другой стороны, кто круче шарит, например, в замыканиях, тот, кто применяет их в современном языке с лямбдами или тот, кто их много лет применял на Си? Вопрос риторический.

    Так что синтаксический сахар или семантическое мясо, это вопрос открытый.

    Ещё одно направление в новых языках это изменения под капотом. Ура! В нашем языке теперь новый сборщик мусора, который можно ставить на паузу, а значит достижима мягкая многозадачность! А у нас теперь целочисленный код оптимизируется на порядок лучше, только надо ставить одну «зюзюку» в начале функции и не делить дробно!

    Это всё замечательно, как говорится, «мамы всякие важны». Но мне вспоминаются основы языкознания, если у вас есть синтаксический сахар, семантическое мясо и подкапотный фарш, то где спрашивается остальные части любого языка: грамматика, лексика? Соответственно возникла идея «лексического крема» или «грамматического варенья».

    Сегодня хочу представить вам экспериментальный язык программирования, Elfu. Название довольно внезапное, просто один мой друг, сумасшедший учёный из Новосибирского Академгородка, изобретающий систему автоматического доказателства теорем, увидев пример кода воскликнул: «это что такое, эльфийский!?».

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

    Просто для примера, картинка абстрактного искусства:

    this.a = this.compare((this.b + this.c) && this.d, this.x + this.y / this.z,

    (function() { var closure = 'val'; return function() { alert(closure); }; })())

    И так на пол экрана! Мне ужасно захотелось, просто чтобы понять, что происходит стереть все упоминания this, примерно так:

    a = compare((b + c) && d, x + y / z

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

    Тогда я решил сделать экспериментальный язык, где заменить this на , function на ➮.

    a = compare((b + c) && d, x + y / z,
    (➮() { var closure = 'val'; return ➮() { alert(closure); }; })())

    Опыт транспилеров у меня уже был, с проектом dotcall, а вообще система транспиляции в JavaScript мне приглянулась в coffeeScript. Дело сразу пошло. Сделав маленький траспилер в JavaScript я стал активно пользоваться своим детищем, чтобы посмотреть, насколько это удобно на практике. Ввод необычных символов сразу меня беспокоил, ведь на клавиатуре всего 32 символа. Но использование замены по табу решило эту задачу, набирать на практике оказалось очень удобно и легко.

    Поскольку я каждый день много раз вынужден набирать конструкции вроде такой:

    for (var i = 0; i < data.length; i++) {

    и давно мечтал иметь её сокращёный аналог, у меня даже прижилось в С++ макро each(i, array), я решил сразу сделать и такое:

    i ⬌ data {

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

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

    Поскольку я не пользуюсь отладчиком, а пользуюсь выводом в консоль и отладочными кодомодификациями, то есть фактически набираю console.log() десятки и сотни раз за трудовую сессию, то мне сразу захотелось упростить этот набор, и вместо:

    console.log('hello world', '!')

    набирать

    ロ 'hello world', '!'

    Собственно предыдущая строчка это и есть hello.yy, то есть «hello world in elfu programming language»!

    Потом, в функциональном программировании часто встречаются упрощённые функции, вроде того:

    this.data = this.data.map(function (item) { if (item > 20) return item } )

    после замены function на ➮, было решено попробовать пойти дальше, гулять так гулять:

    data = data ⧉ (➮ item { ⌥(item > 20) $ item } )

    как видите: ⌥ это if, ⧉ это map, $ это return.

    Теперь я вспомнил, что мне постоянно приходится придумывать как назвать этот аргумент item каждый раз, а название ему часто и не нужно, как например в данном случае, вполне подойдёт a. Тогда я решил, что если у функции объявленой через ➮ нет параметров, то по умолчанию объявлены три параметра a, b, c. А если нужно, чтобы у функции фактически не было параметров, то надо указать явно ().

    data = data ⧉ (➮ { ⌥(a > 20) $ a } )

    Как написал один автор в одной статье на Хабре, жаль я забыл ссылку скопировать тогда, «удобно когда не надо глазами парсить лишние кейворды и идентификаторы». Привет тебе, о забытое имя.

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

    Вот ещё несколько любопытных экспериментальных фич Эльфу:

    A ⬊ 1 // A.push(1)

    A ⬋ 22 // A.unshift(22)

    n⁰ = nˣ + mⁱ // n[0] = n[x] + m[i]

    ⌥ (⬤ a ≟ '∅')
    // ⌥ (typeof a == 'undefined')

    ⌥ (name ≠ ⦿ && id ≠ ⦾) ⏀ name
    //if (name != true && id != false) delete this.name

    ロ ⍽(⚂ * 100)
    // console.log(Math.floor(Math.random() * 100))

    То есть ⚂ это игровой кубик, который легко ассоциируется с датчиком случайных чисел. ∅ перечёркнутый кружок, то есть неопределённость. А вот ⏀ это разрубание пополам, то есть уничтожение объекта. Наконец-то можно снова, как в школе на математике произосить mⁱ «эм итое». Правда это суперскрипт, субскрипта в юникоде нет, точнее он есть но очень неполный, в Эльфу он не используется пока.

    Многие символы настолько коротки и понятны, что стало очевидно, что скобки к аргументам после них выглядят громоздко. Пришла идея сделать скобки необязательными, в некоторых случаях. Например str ≀ 'a' аналогично str.indexOf('a'). ≣'fs' аналогично require('fs').

    Уже более полугода, ежедневно я пользуюсь Эльфу. Он работает в node.js (и в браузере при некоторых ухищрениях аналогичных применяемых в других транспилерах, вроде coffeeScript). Я взял расширение файла .yy. Можно просто сделать:

    npm i -g elfu
    require('elfu')
    require('library.yy')

    Все символы используемые в Эльфу это просто символы из набора Unicode. Ничего не изобретено, в болшинстве своём они из странички Unicode спецификации Math and other symbols, но есть и из рэнжей разных языков. Чтобы не было проблем, я сделал шрифт elfu.ttf в котором соединил все на данный момент используемые символы. Но на современных Linux, Windows, MacOS, iOS, Android всё из коробки отображается как надо, хотя некоторые символы берутся из разных шрифтов и могут выглядеть не очень красиво, и быть слегка разного размера.

    Расширение файла .yy это отсылка на эльфийский алфавит, будем воображать, что это некий эльфийский знак, руна. На самом деле на эльфийском языке, надо говорить «Хости ламмен», что значит «Язык чисел». Впрочем, наверное надо расширение .elfu тоже обрабатываеть в require(). Кстати пакет npm elfu устанавливает три утилиты коммандной строки: yy, yyj, jyy. yy можно использовать вместо node: «yy hello.yy», yyj компилирует elfu файл в Javascript с выводом в STDOUT, jyy компилирует обратно из Javascript в Elfu.

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

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

    exebook.github.io/elfu/article.html
    github.com/exebook/elfu
    www.npmjs.com/package/elfu

    Чего бы хотелось от почтенной публики, так это участия, хотя бы понарошечку. Если вас тема заинтересовала, кидайте сюда или на гитхаб ваши предложения, что можно ещё добавить или поменять. Очень много ещё Unicode символов и всяких возможностей! Даже если Эльфу останется лишь экспериментом сумасшедшего философа, многие символы могут пригодиться в других языках и разработках. Кстати, например в Эльфу стандартизованы последовательности для ввода символов по tab-completion. Например io|TAB превращается в ≀ и означает .indexOf(). Есть и готовые конфиги для Sublime Text и Geany.

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

    Какая из описаных в статье фишек поразила вас сильнее всего?

    • 2,8%Xⁱ23
    • 5,3%➮ {}43
    • 5,0%⚫a + ⚫b40
    • 5,0%ロ 'hello world'40
    • 6,2%⚂ * 10050
    • 11,0%⦿ ≠ ⦾89
    • 5,2%42
    • 81,6%Да я просто в шоке!659

    Комментарии 125

      +50
      Вы знаете, чем хороши большинство современных языков программирования? А тем, что если вы знакомы с программированием, знаете хотя бы один язык и чуть чуть английский, то вы можете понять 90% кода языка, который первый раз видите.

      Чтобы пользоваться вашим детищем, нужно либо быть его создателем, либо предварительно мучиться пару недель, запоминая все эти сокращения.
        –12
        Сомневаюсь, что вы правы, возможно, легко поймёте лексику разных языков, почти везде if это if, но грамматика и семантика могут сильно отличаться. Если вы знаете Javascript то через час вы будете шпрехать на Elfu, а вот если вы знаете C++ то вы не скоро сможете писать на Ruby.
        • НЛО прилетело и опубликовало эту надпись здесь
            +2
            if был заменён чисто для эксперимента, посмотреть, «а чего будет если?» язык не стандартизован, всё можно менять в любом направлении. Но если не попробовать, то и не узнаешь, верно? Я же не предлагаю массово переходить на эльфу, а лишь приглашаю к обсуждению минусов и плюсов, буде таковые обнаружатся. Вместо if просился знак вопроса, но он уже используется в языке для архаичной конструкции из С.
              0
              В некоторых местах «if else» все равно приходится заменять на не столь понятные "? :".
                +1
                Точно, можно использовать тернарный оператор вместо if else.
                Eще можно так:
                //if..else if statement
                1==0&&(
                  console.log(5)||"первое условие"
                )||7==8&&(
                  console.log(9)||1
                )||7==7&&(
                  console.log(100)||"условие по умолчанию"
                )
                
                
                //ternar operator
                var x = ['fail','ok'][+isOk];
                

                И еще несколько идей:
                //приведение к Integer
                0 | x
                +x
                
                //перебор  свойств объекта
                for (var k in items) if (items.hasOwnProperty(k)) {
                   // do something with items[k]
                }
                
                //switch value
                ['none','first','second','third'][isFirst*1||isSecond*2||isThird*3]
                
                //binary combine flags
                ['none','first','second','first and second or third'][isFirst+isSecond*2|isThird*3]
                
              +3
              Писать и читать — разные вещи.
              Он говорил про читать, и в этом я с ним согласен.
                +2
                вам про Фому, а Вы про Ерёму.
                Вам:
                если вы умеете программировать и понимаете английский

                а вы:
                Если вы знаете JS<...>Если вы знаете C++


                Знание синтаксиса языка != умение программировать.
                +4
                С практической точки зрения — всё примерно как вы описали.

                Но само по себе это прямо таки кандидат в хаб "ненормальное программирование" (на момент публикации комментария пост не там) :-) Потому что прикольно, странно и ненормально. Но прикольно!
                  0
                  Спасибо за идею, добавил в крейзи. Это не обидно, кого только не считали крейзи.
                  +1
                  Это разновидности языков. Нельзя вот так взять и понять пролог с первого взгляда. Или функциональщину, если до этого вся жизнь прошла в написании императивного кода. А вот внутри групп отличие действительно только в синтаксисе и сахаре.
                    –4
                    Я вот Руби и Ним не могу понять. Мне кажется, вообще, понять язык не написав хотя-бы 5К+ строк кода невозможно.
                  +6
                  Думаю, язык программирования должен быть максимально приближен к человеческому, дабы понимание языка было простым и чистым как мысли программиста. А писать всякие закорючки и при этом помнить их все все равно что изучить еще японский (грубо говоря), а потом уже на нем начать программировать, то есть два языка учить.
                    +1
                    Вы правы и неправы одновременно. Ещё раньше чем мы начали программировать мы брали листок бумаги и рисовали закорючки. Да и сейчас в офисе можно встретить доску на которой идёт брэйнсторм, и там в основном стрелочки и каракули. Это тоже очень по-человечески.
                      0
                      Есть мысли, а есть слова. Так вот стрелочки и каракули — это мысли. А программирование — это слова.
                        +3
                        Вы продолжайте продолжайте свою мысль,… зачем нам слова, если мысль была изначальной? не остаться ли нам совсем в мыслях?

                        p.s. когда читал про мозгоинтерфейс emotiv epoc, первое что я подумал, на сколько реально его интегрировать со средой разработки.

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

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

                          Мне идея еще одного узкоспециализированного словаря иероглифов не нравится.

                          Для того, чтобы не не писать this. и так есть специальная конструкция.
                            0
                            Немного оффтопик, но вы что-то странное читали про Emotiv. Он, как и все прочие eeg-контроллеры, работает по принципу измерения мозговой активности. К возможности чтения мыслей он имеет примерно то же отношение, как измерение температуры на разных участках процессора к возможности прочитать исполняемый код — т.е. почти никакого. Управлять с его помощью чем бы то ни было довольно сложно, средний человек с трудом осиливает даже две команды, а чтобы стабильно использовать четыре команды — нужно чуть ли не в медитации сидеть почти все время. Встроенные гироскопы для позиционирования курсора (отслеживают повороты головы) — довольно неудобны для работы с текстом, поскольку им радикально не хватает точности.
                        +3
                        *шутка про программирование в 1С*
                          +1
                          Такова была идеология создателей SQL, он даже назывался structured english query language. Всё же немного закорючек для лаконичности иногда полезнее и оказывается в итоге проще в восприятии.
                            +2
                            Естественные языки — ужасны. Уподоблять им язык программирования — только портить.
                              –4
                              Полностью согласен, что лучше, если язык программирования будет ближе к человеческому. Если сравнить русский и английский, то русский приближен к литературному и слова длиннее английских и букв в алфавите больше. Не зря, именно среди русских больше писателей и поэтов, чем среди англоязычных людей, да и людей других национальностей, да и литературные произведения на русском языке считаются более талантливыми и это подтверждают многие зарубежные аналитики. Да и русский язык логикой не понять, как и не понять как работает человеческий интеллект, иначе искусственный интеллект уже давно был бы создан. Не удивлюсь, если искусственный интеллект первым создаст именно русский человек.
                              +15
                              #define
                                0
                                Поясните, будьте добры.
                                  +7
                                  AndrewN намекает, что вы по сути заменили некоторые конструкции и функции языка на unicode символ, что, в целом, можно сделать с помощью #define
                                    –21
                                    Но, ведь, общеизвестно, что define — это зло. Поэтому в Javascript его нет.
                                      +16
                                      #define — это чудо! Пользоваться языком без #define скучно.
                                        +3
                                        А то!
                                        # define true (rand()%10) //Happy debugging suckers
                                          0
                                          Ой, да это детский лепет! Я при помощи эрланговского parse_transform и не такое могу сделать =)
                                        +1
                                        Ну да, зато ваш эльф — чудо
                                          0
                                          Простите? А как же, допустим, задавать в настройках проекта частоту работы ядра контроллера? Описывать порты для быстрого доступа?
                                          Допустим, кусочек кода будет читаем, если:
                                          #define OW_PORT PORTD
                                          #define OW_PIN (1<<PORTD7)
                                          .....
                                          OW_PORT &= ~OW_PIN; // Эмуляция шины OneWire
                                          ...
                                          Или так:
                                          PORTD &= ~(1<<PORTD7); // То же, но без дефайнов
                                          

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

                                          Опять же
                                          #define F_CPU 11059200
                                          #define BaudRate (F_CPU/UART_BAUD_RATE)/16-1;
                                          ...
                                          UBRR0 = BaudRate;			// Baud rate
                                          

                                          Иначе пересчитывать каждый раз ручками? Ну, нет, мне удобнее так, с дефайнами.
                                            +1
                                            Во-первых, это была шутка. Во-вторых, константы можно задавать и без дефайнов, и даже рекомендуется, тогда будет работать проверка типов.
                                    +17
                                    Поздравляю, вы изобрели APL.
                                      –4
                                      Я понимаю, что это шутка, но вы можете запутать людей, APL изобрёл Кен Иверсон!

                                      Но там есть несколько моментов. Во-первых тогда ещё не было Unicode, сейчас он есть и повсеместно подеживается. Код Эльфу отображается даже на хабре без всякой подготовки, а код APL до сих пор приводится скринами. Ну и кроме символов это был целый пласт семантики, тонкостей реализации, целый мир. А Эльфу это просто транспилер, который даже на синтаксис старается на покушаться лишний раз.
                                        +3
                                        Ваша неправда, у меня в последней Firefox под Win7 предпоследний пункт опроса не отображается.
                                          0
                                          Пичаль
                                            +7
                                            в хроме (вин) не отображаются: ⚫, ⧉, ⬤, ⦾ и ⚂ :-)
                                            В лисе вроде бы отображается всё.
                                              +1
                                              У меня винда, хром. Полет нормальный. Может у вас юникод сломан?
                                          +4
                                          отображается даже на хабре
                                          охохо… А на гиктаймсе?
                                          Откройте лучше свой пост под виндой, узнаете, как он «отображается».
                                            –8
                                            Винда приходит и уходит, уступая место новой винде. А Unicode это вечные ценности!
                                              +4
                                              Вы вот серьезно щас не понимаете разницы между кодировкой, стандартом и поддержкой символов в тех или иных шрифтах?

                                              По поводу вечных ценностей в юникоде очень рекомендую эту статью: modelviewculture.com/pieces/i-can-text-you-a-pile-of-poo-but-i-cant-write-my-name
                                                –3
                                                Вангую, что поддержа юникода в винде будет улучшаться.

                                                Прикольно, статью Адитьи Мукерджи я читал недавно, как мир тесен. Но он говорит о вещах весьма специфических, в основном о том, что делает Harfbuzz в хроме и линуксе и редких буквах хинди. Есть такая вещь как композитный юникод. В эльфу все символы одиночные, никаких комбинаций с налезанием на шею друг другу нет.
                                                  +8
                                                  Я смотрю, у вас туго с ивзлечением информации из печатного текста. Винда превосходно поддерживает юникод, кроме шуток. А вот шрифт Arial Unicode — очень посредственно.
                                                    0
                                                    Да уж. Пришлось через Developer Tools дописывать "Segoe UI Symbol","Segoe UI" в font-family.
                                            –1
                                            Нет, APL изобрели вы! А анимэ изобрела Бритни Спирс, это уж все знают.
                                              –11
                                              АнимЭ изобрёл ёжик в туманЭ когда плыл по рЭкЭ с варЭньем.
                                              0
                                              >тогда ещё не было Unicode, сейчас он есть и повсеместно подеживается. Код Эльфу отображается даже на хабре без всякой подготовки, а код APL до сих пор приводится скринами

                                              И это печально. :( Потому что APL — мне очень нравится.
                                            +3
                                            Сходу можно запомнить только пару-тройку сокращений. Чтобы выучить все — надо постоянно работать с этим пару месяцев.
                                            Насчет того «что глаз за такой синтаксис цепляется»: глаз цепляется за то, к чему привык цепляться. И если он за 10 лет привык цепляться к this и function, то ему будет проще без такого сахара.
                                              +20
                                              Вам должен понравиться APL.
                                              Быстрая сортировка: qsort←{1≥⍴⍵:⍵ ⋄ e←⍵[?⍴⍵] ⋄ (∇(⍵<e)/⍵), ((⍵=e)/⍵), (∇(⍵>e)/⍵)}
                                              Игра «Жизнь»: life←{↑1 ⍵∨.∧3 4=+/,¯1 0 1∘.⊖¯1 0 1∘.⌽⊂⍵}
                                              Подсчет каждого символа в строке: freq←{(⍪∪⍵),+/(∪⍵)∘.⍷⍵}
                                              Красота!
                                                –9
                                                Вы так говорите, будто это что-то плохое.
                                                +4
                                                А где тут новый язык то? Какую новую семантику вносят эти замены?
                                                  –3
                                                  В статье явно указано, что автор не покушается на семантику, а хочет провести эксперимент, что будет если развивать язык через символьно-лексико-грамматический уровень. В лингвистике есть аналогичные случаи где разделены уровни языкознания, например кое-где с кириллицы перешли на латиницу и наоборот, а в Японии три «алфавита» которыми можно одно и то же записать, а жители Кантона и Пекина совсем не понимают друг друга на слух, но зато при переписке у них оказывается практически идентичный язык.
                                                  +7
                                                  Поздравляю, вы изобрели APL из 60ых.
                                                    +4
                                                    У меня многие ваши символы отображаются как квадратики. Это так и должно быть?

                                                    Вообще конечно 32 символа для языка программирования — это мало (особенно это понимаешь когда в С++ и подобных языках используются угловые скобки шаблонов). Но преимущество множества символов ASCII перед Unicode в том, что символы ASCII можно ввести с любой клавиатуры мира. В отличие от Unicode, в котором хоть и немало полезных символов, но толку от них без соответствующей клавиатуры или специального софта значительно меньше.

                                                    Я в каком-то обсуждении предлагал такую идею — использовать свободные коды 0x01… 0x1F (за исключением POSIX 0x00, 0x07..0a0A, 0x0D) для маппинга наиболее востребованных символов Unicode (вероятно стрелки двух видов, дополнительные пары скобок и еще что-нибудь… можно даже взять первоначальные символы ASCII).
                                                      –5
                                                      Ценю ваш юмор. Квадратики конечно не нарочно, но всё равно смешно.

                                                      Проблема ввода через «fu|TAB» или «th|TAB» решена легко. А ".1|TAB" даёт ¹.

                                                      Насчёт маппинга не понятно, в клавиатуру зашить маппинг или куда?
                                                        0
                                                        В сам стандарт Юникода, в драйверы клавиатур и ОС и физически наносить на клавиши.
                                                        Поскольку количество клавиш ограничено, то можно нанести по одному спецсимволу на каждую буквенную клавишу + задействовать какую-нибудь клавишу или сочетание в качестве шифта.
                                                        Почему маппинг на однобайтовые коды? Ну все-же я считаю что Юникод не однороден, и базовая однобайтовая кодировка ASCII важнее чем двухбайтовый набор символов USC2, который в свою очередь важнее чем полный Unicode, превращающийся постепенно в помойку.
                                                          +2
                                                          Вы зря выбрали квадратики. По мне так основная идея — возможность оценить взглядом больше информации и не путаться в скобках и словах.

                                                          ⦿, ⦾, ⏀, ⚫, ⍽, ⚂ — для меня все эти символы сливаются в один и тот же символ. В том смысле что чтобы понять какой из них перед нами надо останавливать взгляд и внимание! Чего категорически нельзя делать при чтении.
                                                            +1
                                                            Черт, это была проблема машины за которой я смотрел ;) на winxp были квадратики а на линукс и win7 — вполне себе кругляшки и загогулины.
                                                              +1
                                                              А у меня на Linux первые три символа — квадратики, следующие три — отображаются нормально.
                                                        +1
                                                        www.explainxkcd.com/wiki/index.php/1537:_Types
                                                          +6
                                                          Я как в исходники scalaz попал
                                                            +38
                                                            image
                                                              +5
                                                              Ещё один всё понял.
                                                                +5
                                                                Выложите примеры кода картинками, а то у меня не все символы показываются =)
                                                                  +5
                                                                  image
                                                                    0
                                                                    Хотя лучше просто пройти по ссылке, там все примеры ридми с репозитория и внедрённый в страничку средствами CSS шрифт elfu.ttf.

                                                                    exebook.github.io/elfu/article.html
                                                                      0
                                                                      .bind можно поменять на стрелочку вверх, а запятую в объектах вообще убрать
                                                                        0
                                                                        Кажется я уже в транспилере забил ꘉ для бинд, но это было только на этой неделе и ещё не пользовался. Кстати это показывает, что на эльфу не обязательно использовать эльфу, можно писать на JS и только там где хочется применять эльфу.
                                                                          0
                                                                          Кстати сразу чувствуется человек много пишет на JS, я тоже регулярно задумываюсь как упростить object literal definition. Можно и двоеточие убрать во многих случаях.

                                                                          object = { a 123 b 'hello' }
                                                                            0
                                                                            Двоеточие лучше оставить, иначе не понятно если посмотреть в середину {a 1 b 2 3 c d 4 e 5}.
                                                                          +9
                                                                          У вас последние две строчки нечитаемые совершенно.
                                                                            +3
                                                                            извините, жесть.
                                                                              +3
                                                                              «Язык гетто» или слабонервным вход воспрещен. Можно смело ставить в одну линейку с BrainFuck и Whitespace. Выглядит отпадно! Но сам бы я на таком писать… увольте. Запишу в историю, с пометкой «Как делать не стоит».

                                                                              Борюсь с остатками здравого смысла, и прошу разработать язык Орков.
                                                                            +10
                                                                            *Отскрёб челюсть от столешницы и пошёл писать на Си под микроконтроллер, бубня про себя что-то про вообще все языки программирования и древние заветы Си*
                                                                              +4
                                                                              Иероглифическое программирование. Почему бы и нет, есть же Brainfuck, Malbolge и т.п. экзотика. Спасибо) Я в шоке.
                                                                                +11
                                                                                Приходит такой новичек к вам в команду, открывает код и видит пелену всяких смайликов вместо кода. Смотрит календарь — нет там не 1 апреля, дальше та картинка с котиком выше :)
                                                                                  +1
                                                                                  Вместо верхнего индекса для доступа к элементу массива стоит использовать нижний — традиционная математическая нотация. Однако код a[b[c[d[e]]]] станет не читаемым не из за иероглифов, а из за того что шрифт станет слишком мелким.
                                                                                    –3
                                                                                    В статье указано, что в Unicode практически нет нижнего индекса, есть только верхний.

                                                                                    a[b][c][d][e] записывается как aᵇᶜᵈᵉ.

                                                                                    Записать a[b[c[d[e]]]] можно только как a[b[c[d[e]]]] или a[b[c[dᵉ]]], большая вложенность индексов тут невозможна, это же просто символы юникода, а не особый графический редактор как Матлаб или Вольфрам.

                                                                                      +4
                                                                                      Тоесть a[bcde] и a[b][c][d][e] одно и то же?
                                                                                        –3
                                                                                        Нет.
                                                                                    0
                                                                                    Стрелочки в push/unshift есть смысл сделать в сторону A (т.к. запихиваем в A),
                                                                                    ну и для pop/shift наоборот — от A.
                                                                                      0
                                                                                      ⬊ is for .push and ⬈ is for .pop.
                                                                                      ⬋ is for .shift and ⬉ is for .unshift.

                                                                                      Всего же четыре комманды для работы со стеком в Javascript. Причём shift/unshift это аналог pop/push, только «с другой стороны» массива. Поэтому в любом случае надо использовать все 4 стрелочки. Впрочем есть ещё вертикальные и горизонтальные. А так же несколько десятков всяких других.

                                                                                      Предложенная вами мнемоника «по направлению к идентификатору» мне в голову не приходила, я больше всё воображал стэк как некую пачку чего-то, да ещё с двумя концами, так что, спасибо за ценную мысль!
                                                                                      +15
                                                                                      1. На лекциях «Станки и инструменты» (речь о технологии машиностроения) препод, имея за плечами неслабую практику работы токарем, задавал нам такой вопрос:

                                                                                      — Вот есть станок с четырьмя хитровыделанными ручками переключения передач, комбинацией которых можно выбрать одно из дофига скольки возможных количество оборотов шпинделя в минуту, а есть другой станок, на котором таких ручек 10, и скоростей всего 10, и каждая из этих ручек включает и выключает свою скорость. Который удобнее в работе?

                                                                                      Все дружно так хором отвечали, мол, первый, канешна! Режимов ведь больше!

                                                                                      На что препод, хитрО прищурившись, говорил: А вот фиг вам! Эти 10 ручек ты знаешь на ощупь. Надо переключить — не глядя переключаешь нужную из одного крайнего положения в другое крайнее (а третьего и нет) и точишь дальше. Напротив, работая на первом же станке ты бросаешь всё и идёшь полминуты дёргаешь эти долбаные рукоятки, которые к тому же ещё и включаться как надо не хотят.

                                                                                      2. Балуясь в своё время на Спектруме, сперва поражался и долго ржал над его клавиатурой:
                                                                                      image

                                                                                      Всего 40 клавиш, на многих нанесены ключевые слова из бейсика и не только. «Нафига?» — недоумевал я, набрать же несложно!

                                                                                      Спустя каких-то полгода неожиданно поймал себя на мысли, что сижу и пишу программу в кромешной тьме, при свете только телевизора. Стемнело, пока сидел. Клавиш почти не видно, видно только их очертания, слепым методом печати не владею даже примерно. Но программу писал. Да, баловство (хотя тогда вроде курсовую какую-то рассчитывал). Спустя много лет с лёгкой грустью периодически вспоминаю то время, в которой слово RANDOMIZE набиралось одним нажатием. Эхххх… Дааа… :)

                                                                                      3. Ну да, если мыслить в рамках эксперимента, проведённого автором, придётся многое запоминать. Эммм… А сейчас как будто запоминать приходится мало. Вот, приходит, мол, джуниор, и видит, мол, такое. Так блин, большинству джуниоров любой код сложнее хелловорда покажется такииим!!!

                                                                                      4. Как давно когда-то читал у кого-то из матёрых касательно интерфейсов — идеальный интерфейс у устройства, которое называется «КАРАНДАШ». Да, да, тот самый, деревянный. Учиться пользоваться им приходится долго, зато, как освоил — его ваще не замечаешь. В буквальном смысле. Возьмите ручку/карандаш, бумажку, попишите чего-нибудь и понаблюдайте за собой — куда вы смотрите в момент письма? Навряд ли удивлю, но — на кончик карандаша. На то место, которое пишет. Но, блин, держите-то вы его не за это место, а за другое! И никого, блин, нифига не парит, что то место, которое пишет на самом деле, держать неудобно, но есть нормальная абстракция, которая позволяет этим делом управлять. Сам карандаш, собсно, за который вы его и держите обычно.

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

                                                                                      Исходя из всего вышенаписанного, как именно выглядит код — не так уж и важно, на самом деле. Важно, чтобы он был читаемым, писаемым, и, самое главное, исполняемым. :) Правильно исполняемым, да. Ведь, глядите: исторически изначально были номера команд, потом наборы номеров команд, потом мнемоники команд, потом появились первые либы, потом либы интегрировались и переросли в языки… И, заметьте, опаньки: операторы и ключевые слова в языках — есть! А asm-мнемоники и коды команд процессора — ушли. Нет, где-то и они есть, на своих уровнях. Но здесь — их нет. Да и не надо, не место им тут.

                                                                                      То, что мы сейчас наблюдаем на поприще написания кода, похоже на следующий этап. Уже не особо важен сам ЯП, на котором код пишется. Используемая платформа, на которой это всё вертится, фреймворки и прочие либы становится порой гораздо важнее. И тут вылазит ещё один момент касаемо запоминания: если авторы языков часто ограничивают введение новых ключевых слов, то авторы фреймворков обычно вааааще не стесняются — чем больше, тем круче! И запоминать приходится часто не одно новое ключевое слово языка, 100500 функций/состояний/дефферед/префферед/хренещознаетчегофферед из того или иного API, фреймворка, библиотеки. Тыщи их, и имя им — легион… :)

                                                                                      И, здесь я с автором совершенно согласен — пора двигаться дальше. Пора придумывать что-то новое. Но не для того, чтобы добавить к вышеупомянутым 100500 ещё половину, а для того, чтобы родилась какая-то новая концепция, которая объединит в себе хотя бы часть из этих стапицот, и уменьшицца стопицот, и часть изъятая устаканицца, стандартизуецца, уедет в ЯП и будет всем щасье…

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

                                                                                      Единственное, что для этого на самом деле нужно делать — это просто делать. И сделать.

                                                                                      Автор делает. Спасибо ему.
                                                                                        +1
                                                                                        Надо ему как в APL и в Вашем примере создать альтернативную раскладку клавиатуры, чтобы нужный спецсимвол было бы легко набрать.
                                                                                          0
                                                                                          У APL самой главной проблемой были шрифты, из-за чего на первом попавшемся компьютере этот язык нельзя было запустить. Ведь подавляющее большинство компьютеров имело тогда не графический, а текстовый дисплей с намертво зашитыми символами, не предусматривающими показ на экране спецсимволов APL. Сейчас же есть UNICODE и прежних проблем имевшихся у APL уже давно нет.
                                                                                            +2
                                                                                            Ага, вот выше по треду обсуждают, как у кого что показывается, рекомендую знакомиться. А представьте вопросы новичков: «У вас в примере написан квадратик и я написал квадратик, почему ничего не работает?!» А ведь так и будет.
                                                                                              0
                                                                                              Это экспериментальный язык, никто не предлагает новичкам его учить.
                                                                                          –1
                                                                                          Спасибо, вы реально внесли вклад в дискуссию!
                                                                                          0
                                                                                          С мобильного Chrome почти никакие символы не читаются(
                                                                                          И большей проблемой выглядит не восприятие (да, дело привычки, хотя тут как-то перебор уже), а ввода этого кода.
                                                                                            0
                                                                                            Ну, да, самая большая проблема — это ввести эти символы. Потому и нужна спецраскладка клавиатуры как в APL.

                                                                                            Ну, или можно набранные команды автоматом конвертировать символы, как при наборе китайских иероглифов, которые набирают латиницей по произношению в пекинском диалекте.
                                                                                              –2
                                                                                              То что вы предлагаете, нам простым смертным не осилить, надо влиять на разработчиков ОС, производителей хардваре, стандартизирующие организации. Поэтому только я и пошёл путём наиболее практичным в данный момент, символы только уже заявленые в Unicode и набор через TAB-completion — уже доступная фича в многих редакторах.

                                                                                              Учитывая, что большинство символов заменяет кейворды от трёх до 10 символов каждый, то даже вместе с кнопкой TAB получается набирать проще. Скажем fu|TAB три клавиши, function — восемь клавиш. Повторюсь, меня поначалу вопрос ввода очень беспокоил, реально ли это, или замучаешся, но практически сразу на практике стало ясно — набирать легко. Почти все снипеты для комплеции двухбуквенные. В общем, хотя я ставил задачу в облегчить чтение, в первую очередь, но и набор оказался облегчён как следствие к некоторому моему удивлению.

                                                                                            0
                                                                                            Все проблемы всегда от плохого нейминга и поряточной структуры кода. Минимально даже ES6 спасет этот код. Типа

                                                                                            (() => {
                                                                                              let b, c, d, x, y, z;
                                                                                            
                                                                                              //...
                                                                                              let compare = (a) => {
                                                                                                //...
                                                                                              }
                                                                                            
                                                                                              let isSmth = (b + c) && d,
                                                                                                   isAnthr = x + y / z,
                                                                                                   a = compare(isSmth, isAnthr, () => alert('val'));
                                                                                            
                                                                                              //...
                                                                                            })();
                                                                                            
                                                                                              0
                                                                                              Что есть «поряточной»?
                                                                                                0
                                                                                                Наверное, «Портяночный». Портянка.
                                                                                                0
                                                                                                Кстати, только на днях в рассылке хром-девелоперов промелькнула инфа что arrow function может считаться «mostly implemented».
                                                                                                  0
                                                                                                  В некоторых публикациях пишут, что изначально то, что мы знаем, как Javascript, хотели сделать синтаксически похожим на Lisp, но по маркетинговым соображениям сделали похожим на Java.
                                                                                                  +3
                                                                                                    +2
                                                                                                    Ждал от заголовка статьи перевод языковых конструкций на синдарин.
                                                                                                      0
                                                                                                      Это напоминает старую дискуссию вокруг эсперанто. Автор языка наделал там букв с кружочками и птичками, что оказалось во всех отношениях неудобно — ни во времена линотипов, ни во времена Юникода. В языках-последователях извращаться не стали, необычные символы сделали обычными диграфами.

                                                                                                      Здесь то же самое — гораздо быстрее и проще прочитать и осмыслить «if», чем некую непонятную закорючку. А когда этих закорючек много, от них и вовсе рябит в глазах.

                                                                                                      Практическое применение имеют только стрелки, потому что это символ, известный всем с детства, и считывающийся автоматически. Но и их смысл не стоит слишком уже раздувать, вводя 100500 их видов.
                                                                                                        0
                                                                                                        >гораздо быстрее и проще прочитать и осмыслить «if», чем некую непонятную закорючку

                                                                                                        Что мешает стандартные мат.символы как это сделали в APL?
                                                                                                          +1
                                                                                                          Очевидно, то же самое — проблемы с вводом и выводом.

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

                                                                                                          Что-то мне подсказывает, что я в этом мнении не одинок, поскольку все попытки внедрить в ЯП математическую нотацию провалились (например, в Алголе-60 тоже с этим баловались). Да и Вольфрам сделал у себя в Математике единый универсальный синтаксис без всяких иероглифов.
                                                                                                            0
                                                                                                            >математические формулы похожи на какой-то очень кривой и плохо читаемый язык программирования, и для человека, пришедшего в программирование не со стороны математики, они не так уж удобны.

                                                                                                            У тех кто пришёл не со стороны математики имеются также серьёзные проблемы с функциональными языками с их Лямбда-исчислением. Но, тем не менее те кто пишут на таких языках всё же находятся. (^_^)
                                                                                                              0
                                                                                                              Думаю, что вы не правы.

                                                                                                              Лямбда-исчисление — это очень специфическая математика, никак не математическая классика. Пришедшие в программирование со стороны математики, особенно прикладной, скорей пишут в стиле Фортрана-66 — сам видел.

                                                                                                              Что же касается ФП, то лично я его освоил по прекрасной книге «Higher-Order Perl», подход в которой ничуть не математический, а чисто программистский: вот как красиво можно решить сложные задачи. Следовательно, путь из абстрактной математики — не единственный.
                                                                                                                0
                                                                                                                Спасибо за книжку! (жаль плюсик поставить не могу)

                                                                                                                А по F# что-нибудь подобное есть?
                                                                                                                  0
                                                                                                                  К сожалению, не знаю.
                                                                                                        0
                                                                                                        Это как-то так в итоге выглядит функция из первого примера?
                                                                                                        (➮() { closure = 'val'; $ ➮() { ロ closure } })())
                                                                                                        

                                                                                                        Теперь появляется проблема со скобочками…
                                                                                                          0
                                                                                                          У меня тоже вместо ряда символов — квадратики.

                                                                                                          Надо было не выпендриваться, а как в APL взять стандартные мат.символы и буквы греческого алфавита, которые благодаря UNICODE — сейчас у всех есть.
                                                                                                          (а не как в о времена APL — когда на большинстве компьютеров эти символы просто отсутствовали в charset)
                                                                                                            0
                                                                                                            Я не выпендриваюсь, это эксперимент. Предложите ваши варианты. Например, что из математических символов предложите для push/pop, function/this, console.log?
                                                                                                              0
                                                                                                              Нужно взять общедоступные расширенные символы, которые есть у каждого.
                                                                                                                0
                                                                                                                А поконкретнее можно? какие именно участки Юникода вы имеете ввиду?
                                                                                                                  0
                                                                                                                  Думаю у каждого есть мат.символы, наиболее употребительные диакритические знаки, расширенная латиница, греческие и стрелочки.
                                                                                                            0
                                                                                                            (➮ { closure = 'val'; $ ➮ { ロ closure; } })()

                                                                                                            если нет ни имени ни аргументов то фигурная скобка может сразу следовать за «иероглифом» функции (стрелкой). И в конце выражения выводимого по ロ (console.log()) надо ставить точку с запятой, если не конец строки.
                                                                                                            +2
                                                                                                            По-моему самое замечательное это «по умолчанию объявлены три параметра a, b, c».
                                                                                                              +1
                                                                                                              У меня, в стековом языке, который я пишу, операция «возврат предыдущего результата» возможна для x, y, z, t, u, v, w — семи аргументов. Ну а на моей предыдущей работе checkstyle ставил warning методам, у которых было больше семи аргументов. Три — мало…
                                                                                                                0
                                                                                                                Не очень понял посылы двух предыдущих ораторов (это не ирония, не сарказм, просто факт), поэтому для ясности скажу:

                                                                                                                a b c объявляются если полностью опустить блок декларации аргументов:

                                                                                                                ➮ min { // молча объявлены a,b,c
                                                                                                                if (a < b) $ a;
                                                                                                                $ b
                                                                                                                }

                                                                                                                ➮ showVersion () { // функция без аргументов
                                                                                                                var a = '0', b = '1', c = '25'
                                                                                                                ロ 'version: ' +a+ '.' +b+ '.' +c
                                                                                                                }

                                                                                                                ➮ distance (x, y, x2, y2) { // явно объявленые имена
                                                                                                                x -= x2
                                                                                                                y -= y2
                                                                                                                $ √(x*x + y*y)
                                                                                                                }

                                                                                                                  0
                                                                                                                  Вы считаете, что три аргумента по умолчанию в качестве для синтаксического сахара достаточно? А если хочется больше, то не грех и заставить программиста их объявить?
                                                                                                              +1
                                                                                                              Назад, к природе, к APL!

                                                                                                              В жабоскрипе эти бесконечные this и function пишутся от безысходности, — от примитивной объектной модели.
                                                                                                              А поскольку они сильно перегружены ролями — это и конструкторы классов, и конструкторы объектов, и продолжения, и замыкания, и изоляция локальных переменных, и просто самые обычные функции, — получается адъ.

                                                                                                              Так может, стоило не в сахар играть, а пойти чуть дальше-глубже?
                                                                                                              Например, паттерн ((function(x,y,z){.....})(a,b,c)) засахарить в виде ◄x=a,y=b,z=c■.....► (без параметров это будет просто ◄.....►)
                                                                                                                +2
                                                                                                                ⌥ без ⌘ — деньги на ветер.
                                                                                                                  +1
                                                                                                                  В стандартной библиотеке скалы вполне используют стандартные замены => и , <- и , -> и . Они эквивалентны с точки зрения синтаксиса.
                                                                                                                    –1
                                                                                                                    Поздравляю, вы изобрели CoffeeScript.
                                                                                                                      0
                                                                                                                      Окончательно созрела мысль, что набирать код и читать/править код лучше на разных языках…
                                                                                                                        +1
                                                                                                                        Предлагаю не ставить точку с запятой в конце без необходимости(например, в буркмарклете).
                                                                                                                        Вместо квадратных скобочек использовать для индекса подчеркивание
                                                                                                                        arr_i -> arr[i]
                                                                                                                        arr_i_j -> arr[i][j]
                                                                                                                        
                                                                                                                        перенумеровав атомы(само по себе удобно где-нибудь их выписать)
                                                                                                                        const symbol = 0
                                                                                                                        const prev = 0
                                                                                                                        const curr = 1
                                                                                                                        const next = 2
                                                                                                                        
                                                                                                                        можно писать и так:
                                                                                                                        i_symbol_next -> i[0][2]
                                                                                                                        j_curr_symbol -> j[1][0]
                                                                                                                        

                                                                                                                        Нравится идея идеографического программирования.
                                                                                                                        Можно использовать китайские иероглифы в качестве идеограм.
                                                                                                                        Небольшой неполный список:
                                                                                                                        巛 — поток
                                                                                                                        工 — рабочий
                                                                                                                        王 — король(king) — main
                                                                                                                        主 — управление(manage)

                                                                                                                        入 — входить
                                                                                                                        囗 — импорт
                                                                                                                        立 — устанавливать
                                                                                                                        釆 — собирать
                                                                                                                        罒 — держать
                                                                                                                        用 — использовать(using)
                                                                                                                        开 — открывать, начинать
                                                                                                                        匚 — содержать
                                                                                                                        儿 — child
                                                                                                                        厂 — фабрика(factory)
                                                                                                                        不 — нет, отрицание
                                                                                                                        是 — быть
                                                                                                                        有 — иметь
                                                                                                                        木 — дерево(tree)
                                                                                                                        支 — ветка(branch)
                                                                                                                        本 — корень(root)
                                                                                                                        示 — показывать(show)

                                                                                                                        风 — стиль
                                                                                                                        文 — знак
                                                                                                                        言 — слово

                                                                                                                        去 — идти
                                                                                                                        全 — весь(all)
                                                                                                                        至 — максимум(max)

                                                                                                                        止 — stop, till

                                                                                                                        下 — следующий(next)
                                                                                                                        上 — предыдущий(previous)

                                                                                                                        这 — это(this)
                                                                                                                        爻 — влиять, воздействовать

                                                                                                                        見 — вид(view)

                                                                                                                        большая часть приведенных иероглифов — радикалы

                                                                                                                        да простят меня китайцы за столь фривольное толкование иероглифов
                                                                                                                          0
                                                                                                                          Радикалы, это класно) заодно подучить можно.
                                                                                                                          Хотя в данном примере, это всё просто индентификаторы, на сам язык они не влияют. Например, в JavaScript все эти символы валидные составляющие для идентификаторов.

                                                                                                                          // обычный JavaScript
                                                                                                                          function 王 () {
                                                                                                                             var 这 = this
                                                                                                                             console.log(这)
                                                                                                                          }
                                                                                                                          


                                                                                                                          Правда лексер Эльфу на них ругается, надо поправить.

                                                                                                                          Список, видно, трудозатрантый, спасибо. В копилку.

                                                                                                                          0
                                                                                                                          ロ ⍽(⚂ * 100)

                                                                                                                          Тут вот какая-проблема, человек читает эту штуку таким образом:
                                                                                                                          1. Напечатать то что будет дальше.
                                                                                                                          2. Округлить то что будет дальше и напечатать.
                                                                                                                          3. Взять случайное число, что-то сотворить, округлить и напечатать.
                                                                                                                          4. Взять случайное число, умножить на 100, округлить и напечатать.

                                                                                                                          Долгой тренировкой можно добиться быстрого разбора таких цепочек длиной 5-7. Но при длине 12 они уже требуют чтения то вперёд то назад по очереди. А если пишуший не очень задумывался о том что творит то вообще беспорядочно приходится переключать направление чтения.

                                                                                                                          Есть несколько попыток эту проблему обойти, например Forth делает как-то так:

                                                                                                                          100
                                                                                                                          *


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

                                                                                                                          А вот в bash проблему решили спец. оператором и дисциплиной:
                                                                                                                          ⚂ | * 100 | ⍽ | ロ
                                                                                                                            0
                                                                                                                            Здравствуйте.
                                                                                                                            ロ — это особенный случай, у меня в редакторе он даже подсвечивается другим, своим цветом. Всё-таки вывод в консоль постоянно используется как некая мета-комманда при отладке в том числе.

                                                                                                                            В остальном, согласен, граматику идеографического языка (или даже частично идеографического) надо писать с нуля, решая какие-то фундаментальные вопросы.

                                                                                                                            Но, пока-что имеем, то что имеем — обёртку над JavaScript.

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

                                                                                                                          Самое читаемое