Как известно, если ты серьёзный программист, синтаксический сахар тебе не нужен, это баловство. Ещё несколько лет назад 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.
Какая из описаных в статье фишек поразила вас сильнее всего?

Проголосовало 776 человек. Воздержалось 428 человек.

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

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


  1. raid
    12.06.2015 23:12
    +50

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

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


    1. 4p4 Автор
      12.06.2015 23:17
      -12

      Сомневаюсь, что вы правы, возможно, легко поймёте лексику разных языков, почти везде if это if, но грамматика и семантика могут сильно отличаться. Если вы знаете Javascript то через час вы будете шпрехать на Elfu, а вот если вы знаете C++ то вы не скоро сможете писать на Ruby.


      1. Temirkhan
        12.06.2015 23:34
        +12

        Ладно заменили function и this. Их замена даже интуитивно воспринимается легко. Но зачем заменять if? Это два символа, которые понятны любому программисту, в то время, как ? вряд ли кому-то понятно без прочтения документации…
        Язык программирования и стандарты выстраивают фундамент вокруг «говорящих» или «ассоциативных» конструкций, названий методов, классов и т.д. Я, как человек, который не разбирается в ЯП настолько, чтобы сообразить подобную работу, действительно в восторге от подобных манипуляций. Все же, не злоупотребляйте заменой всего и вся. Иначе получится очередной «brainfuck».

        P.S
        единственным и неоспоримым символов для себя отметил функцию


        1. 4p4 Автор
          12.06.2015 23:41
          +2

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


        1. potan
          26.06.2015 15:07

          В некоторых местах «if else» все равно приходится заменять на не столь понятные "? :".


      1. alaska332
        13.06.2015 08:24
        +3

        Писать и читать — разные вещи.
        Он говорил про читать, и в этом я с ним согласен.


      1. mva
        16.06.2015 00:51
        +2

        вам про Фому, а Вы про Ерёму.
        Вам:

        если вы умеете программировать и понимаете английский

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


        Знание синтаксиса языка != умение программировать.


    1. Newbilius
      12.06.2015 23:18
      +4

      С практической точки зрения — всё примерно как вы описали.

      Но само по себе это прямо таки кандидат в хаб "ненормальное программирование" (на момент публикации комментария пост не там) :-) Потому что прикольно, странно и ненормально. Но прикольно!


      1. 4p4 Автор
        13.06.2015 00:02

        Спасибо за идею, добавил в крейзи. Это не обидно, кого только не считали крейзи.


    1. Zibx
      13.06.2015 14:13
      +1

      Это разновидности языков. Нельзя вот так взять и понять пролог с первого взгляда. Или функциональщину, если до этого вся жизнь прошла в написании императивного кода. А вот внутри групп отличие действительно только в синтаксисе и сахаре.


      1. 4p4 Автор
        13.06.2015 14:21
        -4

        Я вот Руби и Ним не могу понять. Мне кажется, вообще, понять язык не написав хотя-бы 5К+ строк кода невозможно.


  1. stas3k
    12.06.2015 23:23
    +6

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


    1. 4p4 Автор
      12.06.2015 23:28
      +1

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


      1. raid
        13.06.2015 01:16

        Есть мысли, а есть слова. Так вот стрелочки и каракули — это мысли. А программирование — это слова.


        1. rPman
          13.06.2015 08:03
          +3

          Вы продолжайте продолжайте свою мысль,… зачем нам слова, если мысль была изначальной? не остаться ли нам совсем в мыслях?

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

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


          1. alaska332
            13.06.2015 08:31
            +1

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

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

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

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


          1. Hellsy22
            13.06.2015 16:54

            Немного оффтопик, но вы что-то странное читали про Emotiv. Он, как и все прочие eeg-контроллеры, работает по принципу измерения мозговой активности. К возможности чтения мыслей он имеет примерно то же отношение, как измерение температуры на разных участках процессора к возможности прочитать исполняемый код — т.е. почти никакого. Управлять с его помощью чем бы то ни было довольно сложно, средний человек с трудом осиливает даже две команды, а чтобы стабильно использовать четыре команды — нужно чуть ли не в медитации сидеть почти все время. Встроенные гироскопы для позиционирования курсора (отслеживают повороты головы) — довольно неудобны для работы с текстом, поскольку им радикально не хватает точности.


    1. tegArt
      12.06.2015 23:56
      +3

      *шутка про программирование в 1С*


    1. Antelle
      13.06.2015 14:40
      +1

      Такова была идеология создателей SQL, он даже назывался structured english query language. Всё же немного закорючек для лаконичности иногда полезнее и оказывается в итоге проще в восприятии.


    1. Zenitchik
      14.06.2015 23:22
      +2

      Естественные языки — ужасны. Уподоблять им язык программирования — только портить.


    1. avtorfile
      17.06.2015 17:22
      -4

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


  1. AndrewN
    12.06.2015 23:25
    +15

    #define


    1. 4p4 Автор
      12.06.2015 23:41

      Поясните, будьте добры.


      1. cher11
        13.06.2015 02:30
        +7

        AndrewN намекает, что вы по сути заменили некоторые конструкции и функции языка на unicode символ, что, в целом, можно сделать с помощью #define


        1. 4p4 Автор
          13.06.2015 02:48
          -21

          Но, ведь, общеизвестно, что define — это зло. Поэтому в Javascript его нет.


          1. Ogra
            13.06.2015 06:34
            +16

            #define — это чудо! Пользоваться языком без #define скучно.


            1. Hellsy22
              13.06.2015 17:02
              +3

              А то!

              # define true (rand()%10) //Happy debugging suckers


              1. Ogra
                13.06.2015 17:59

                Ой, да это детский лепет! Я при помощи эрланговского parse_transform и не такое могу сделать =)


          1. zagayevskiy
            13.06.2015 16:48
            +1

            Ну да, зато ваш эльф — чудо


          1. AlanDrakes
            14.06.2015 08:04

            Простите? А как же, допустим, задавать в настройках проекта частоту работы ядра контроллера? Описывать порты для быстрого доступа?
            Допустим, кусочек кода будет читаем, если:

            #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. 4p4 Автор
              14.06.2015 10:02
              +1

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


  1. k12th
    12.06.2015 23:25
    +17

    Поздравляю, вы изобрели APL.


    1. 4p4 Автор
      12.06.2015 23:36
      -4

      Я понимаю, что это шутка, но вы можете запутать людей, APL изобрёл Кен Иверсон!

      Но там есть несколько моментов. Во-первых тогда ещё не было Unicode, сейчас он есть и повсеместно подеживается. Код Эльфу отображается даже на хабре без всякой подготовки, а код APL до сих пор приводится скринами. Ну и кроме символов это был целый пласт семантики, тонкостей реализации, целый мир. А Эльфу это просто транспилер, который даже на синтаксис старается на покушаться лишний раз.


      1. evocatus
        12.06.2015 23:40
        +3

        Ваша неправда, у меня в последней Firefox под Win7 предпоследний пункт опроса не отображается.


        1. 4p4 Автор
          12.06.2015 23:42

          Пичаль


          1. hedgehog
            13.06.2015 02:12
            +7

            в хроме (вин) не отображаются: ?, ?, ?, ? и ? :-)
            В лисе вроде бы отображается всё.


            1. AllexIn
              13.06.2015 18:31
              +1

              У меня винда, хром. Полет нормальный. Может у вас юникод сломан?


      1. k12th
        12.06.2015 23:42
        +4

        отображается даже на хабре
        охохо… А на гиктаймсе?
        Откройте лучше свой пост под виндой, узнаете, как он «отображается».


        1. 4p4 Автор
          12.06.2015 23:43
          -8

          Винда приходит и уходит, уступая место новой винде. А Unicode это вечные ценности!


          1. k12th
            12.06.2015 23:48
            +4

            Вы вот серьезно щас не понимаете разницы между кодировкой, стандартом и поддержкой символов в тех или иных шрифтах?

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


            1. 4p4 Автор
              12.06.2015 23:58
              -3

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

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


              1. k12th
                13.06.2015 11:14
                +8

                Я смотрю, у вас туго с ивзлечением информации из печатного текста. Винда превосходно поддерживает юникод, кроме шуток. А вот шрифт Arial Unicode — очень посредственно.


                1. withkittens
                  13.06.2015 17:32

                  Да уж. Пришлось через Developer Tools дописывать "Segoe UI Symbol","Segoe UI" в font-family.


      1. k12th
        12.06.2015 23:48
        -1

        Нет, APL изобрели вы! А анимэ изобрела Бритни Спирс, это уж все знают.


        1. 4p4 Автор
          13.06.2015 00:10
          -11

          АнимЭ изобрёл ёжик в туманЭ когда плыл по рЭкЭ с варЭньем.


      1. Idot
        13.06.2015 11:20

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

        И это печально. :( Потому что APL — мне очень нравится.


  1. goooseman
    12.06.2015 23:27
    +3

    Сходу можно запомнить только пару-тройку сокращений. Чтобы выучить все — надо постоянно работать с этим пару месяцев.
    Насчет того «что глаз за такой синтаксис цепляется»: глаз цепляется за то, к чему привык цепляться. И если он за 10 лет привык цепляться к this и function, то ему будет проще без такого сахара.


  1. HurrTheDurr
    12.06.2015 23:28
    +20

    Вам должен понравиться APL.
    Быстрая сортировка: qsort<{1???:? ? e Игра «Жизнь»: life<{^1 ??.?3 4=+/,?1 0 1?.??1 0 1?.???}
    Подсчет каждого символа в строке: freq<{(???),+/(??)?.??}
    Красота!


    1. 4p4 Автор
      13.06.2015 00:01
      -9

      Вы так говорите, будто это что-то плохое.


  1. f0rk
    12.06.2015 23:31
    +4

    А где тут новый язык то? Какую новую семантику вносят эти замены?


    1. 4p4 Автор
      12.06.2015 23:47
      -3

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


  1. ivlis
    12.06.2015 23:39
    +7

    Поздравляю, вы изобрели APL из 60ых.


  1. NeoCode
    12.06.2015 23:39
    +4

    У меня многие ваши символы отображаются как квадратики. Это так и должно быть?

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

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


    1. 4p4 Автор
      12.06.2015 23:52
      -5

      Ценю ваш юмор. Квадратики конечно не нарочно, но всё равно смешно.

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

      Насчёт маппинга не понятно, в клавиатуру зашить маппинг или куда?


      1. NeoCode
        13.06.2015 07:11

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


      1. rPman
        13.06.2015 08:07
        +2

        Вы зря выбрали квадратики. По мне так основная идея — возможность оценить взглядом больше информации и не путаться в скобках и словах.

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


        1. rPman
          13.06.2015 11:49
          +1

          Черт, это была проблема машины за которой я смотрел ;) на winxp были квадратики а на линукс и win7 — вполне себе кругляшки и загогулины.


          1. fshp
            13.06.2015 19:39
            +1

            А у меня на Linux первые три символа — квадратики, следующие три — отображаются нормально.


  1. EndUser
    12.06.2015 23:54
    +1

    www.explainxkcd.com/wiki/index.php/1537:_Types


  1. ImLiar
    12.06.2015 23:58
    +6

    Я как в исходники scalaz попал


  1. ik62
    13.06.2015 00:02
    +38

    image


  1. TheDeadOne
    13.06.2015 06:28
    +5

    Ещё один всё понял.


  1. Ogra
    13.06.2015 06:38
    +5

    Выложите примеры кода картинками, а то у меня не все символы показываются =)


    1. 4p4 Автор
      13.06.2015 11:20
      +5

      image


      1. 4p4 Автор
        13.06.2015 11:39

        Хотя лучше просто пройти по ссылке, там все примеры ридми с репозитория и внедрённый в страничку средствами CSS шрифт elfu.ttf.

        exebook.github.io/elfu/article.html


      1. Zibx
        13.06.2015 14:17

        .bind можно поменять на стрелочку вверх, а запятую в объектах вообще убрать


        1. 4p4 Автор
          13.06.2015 14:23

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


        1. 4p4 Автор
          13.06.2015 14:50

          Кстати сразу чувствуется человек много пишет на JS, я тоже регулярно задумываюсь как упростить object literal definition. Можно и двоеточие убрать во многих случаях.

          object = { a 123 b 'hello' }


          1. Zibx
            25.06.2015 02:36

            Двоеточие лучше оставить, иначе не понятно если посмотреть в середину {a 1 b 2 3 c d 4 e 5}.


      1. withkittens
        13.06.2015 17:35
        +9

        У вас последние две строчки нечитаемые совершенно.


      1. olo
        14.06.2015 04:14
        +3

        извините, жесть.


      1. InWake
        14.06.2015 13:29
        +3

        «Язык гетто» или слабонервным вход воспрещен. Можно смело ставить в одну линейку с BrainFuck и Whitespace. Выглядит отпадно! Но сам бы я на таком писать… увольте. Запишу в историю, с пометкой «Как делать не стоит».

        Борюсь с остатками здравого смысла, и прошу разработать язык Орков.


  1. AlanDrakes
    13.06.2015 07:34
    +10

    *Отскрёб челюсть от столешницы и пошёл писать на Си под микроконтроллер, бубня про себя что-то про вообще все языки программирования и древние заветы Си*


  1. j_wayne
    13.06.2015 09:33
    +4

    Иероглифическое программирование. Почему бы и нет, есть же Brainfuck, Malbolge и т.п. экзотика. Спасибо) Я в шоке.


  1. serf
    13.06.2015 10:03
    +11

    Приходит такой новичек к вам в команду, открывает код и видит пелену всяких смайликов вместо кода. Смотрит календарь — нет там не 1 апреля, дальше та картинка с котиком выше :)


  1. tzlom
    13.06.2015 10:51
    +1

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


    1. 4p4 Автор
      13.06.2015 11:05
      -3

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

      a[b][c][d][e] записывается как a????.

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


      1. mishadoff
        13.06.2015 12:39
        +4

        Тоесть a[bcde] и a[b][c][d][e] одно и то же?


        1. 4p4 Автор
          13.06.2015 13:56
          -3

          Нет.


  1. edwardspec
    13.06.2015 11:59

    Стрелочки в push/unshift есть смысл сделать в сторону A (т.к. запихиваем в A),
    ну и для pop/shift наоборот — от A.


    1. 4p4 Автор
      13.06.2015 14:00

      ? is for .push and ? is for .pop.
      ? is for .shift and ? is for .unshift.

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

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


  1. eternal_why
    13.06.2015 12:00
    +15

    1. На лекциях «Станки и инструменты» (речь о технологии машиностроения) препод, имея за плечами неслабую практику работы токарем, задавал нам такой вопрос:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Автор делает. Спасибо ему.


    1. Idot
      13.06.2015 12:14
      +1

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


      1. Idot
        13.06.2015 12:21

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


        1. newcommer
          14.06.2015 15:47
          +2

          Ага, вот выше по треду обсуждают, как у кого что показывается, рекомендую знакомиться. А представьте вопросы новичков: «У вас в примере написан квадратик и я написал квадратик, почему ничего не работает?!» А ведь так и будет.


          1. 4p4 Автор
            14.06.2015 17:43

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


    1. 4p4 Автор
      13.06.2015 14:10
      -1

      Спасибо, вы реально внесли вклад в дискуссию!


  1. AterCattus
    13.06.2015 13:34

    С мобильного Chrome почти никакие символы не читаются(
    И большей проблемой выглядит не восприятие (да, дело привычки, хотя тут как-то перебор уже), а ввода этого кода.


    1. Idot
      13.06.2015 14:07

      Ну, да, самая большая проблема — это ввести эти символы. Потому и нужна спецраскладка клавиатуры как в APL.

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


      1. 4p4 Автор
        13.06.2015 14:19
        -2

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

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


  1. marapper
    13.06.2015 16:14

    Все проблемы всегда от плохого нейминга и поряточной структуры кода. Минимально даже 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'));
    
      //...
    })();
    


    1. 4p4 Автор
      13.06.2015 16:31

      Что есть «поряточной»?


      1. mapron
        14.06.2015 05:32

        Наверное, «Портяночный». Портянка.


    1. 4p4 Автор
      13.06.2015 16:32

      Кстати, только на днях в рассылке хром-девелоперов промелькнула инфа что arrow function может считаться «mostly implemented».


    1. Flammar
      14.06.2015 18:12

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


  1. RolexStrider
    13.06.2015 19:21
    +3

  1. Velikodniy
    14.06.2015 08:37
    +2

    Ждал от заголовка статьи перевод языковых конструкций на синдарин.


  1. gatoazul
    14.06.2015 11:46

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

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

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


    1. Idot
      14.06.2015 12:03

      >гораздо быстрее и проще прочитать и осмыслить «if», чем некую непонятную закорючку

      Что мешает стандартные мат.символы как это сделали в APL?


      1. gatoazul
        14.06.2015 12:14
        +1

        Очевидно, то же самое — проблемы с вводом и выводом.

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

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


        1. Idot
          14.06.2015 12:37

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

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


          1. gatoazul
            14.06.2015 12:46

            Думаю, что вы не правы.

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

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


            1. Idot
              14.06.2015 12:50

              Спасибо за книжку! (жаль плюсик поставить не могу)

              А по F# что-нибудь подобное есть?


              1. gatoazul
                14.06.2015 13:01

                К сожалению, не знаю.


  1. Xao
    14.06.2015 12:58

    Это как-то так в итоге выглядит функция из первого примера?

    (?() { closure = 'val'; $ ?() { ? closure } })())
    

    Теперь появляется проблема со скобочками…


    1. Idot
      14.06.2015 13:09

      У меня тоже вместо ряда символов — квадратики.

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


      1. 4p4 Автор
        14.06.2015 17:47

        Я не выпендриваюсь, это эксперимент. Предложите ваши варианты. Например, что из математических символов предложите для push/pop, function/this, console.log?


        1. Idot
          14.06.2015 18:16

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


          1. 4p4 Автор
            14.06.2015 18:31

            А поконкретнее можно? какие именно участки Юникода вы имеете ввиду?


            1. Idot
              14.06.2015 19:10

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


    1. 4p4 Автор
      14.06.2015 17:46

      (? { closure = 'val'; $ ? { ? closure; } })()

      если нет ни имени ни аргументов то фигурная скобка может сразу следовать за «иероглифом» функции (стрелкой). И в конце выражения выводимого по ? (console.log()) надо ставить точку с запятой, если не конец строки.


  1. andy128k
    15.06.2015 00:50
    +2

    По-моему самое замечательное это «по умолчанию объявлены три параметра a, b, c».


    1. Flammar
      22.06.2015 13:33
      +1

      У меня, в стековом языке, который я пишу, операция «возврат предыдущего результата» возможна для x, y, z, t, u, v, w — семи аргументов. Ну а на моей предыдущей работе checkstyle ставил warning методам, у которых было больше семи аргументов. Три — мало…


  1. nickolaym
    15.06.2015 17:41
    +1

    Назад, к природе, к APL!

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

    Так может, стоило не в сахар играть, а пойти чуть дальше-глубже?
    Например, паттерн ((function(x,y,z){.....})(a,b,c)) засахарить в виде (без параметров это будет просто <.....>)


  1. salas
    16.06.2015 00:21
    +2

    ? без ? — деньги на ветер.


  1. grossws
    16.06.2015 04:21
    +1

    В стандартной библиотеке скалы вполне используют стандартные замены => и ?, <- и <, -> и >. Они эквивалентны с точки зрения синтаксиса.


  1. adrianov
    16.06.2015 15:36
    -1

    Поздравляю, вы изобрели CoffeeScript.


  1. Flammar
    22.06.2015 13:20

    Окончательно созрела мысль, что набирать код и читать/править код лучше на разных языках…