Пользователь
24,0
рейтинг
19 сентября 2014 в 07:58

Разработка → Emoji Lisp

(пятница)
Всё началось с того, что я прочитал у Станислава Лема в романе «Мир на Земле» (1985), что в будущем общение на языке будет заменено общением при помощи пиктограмм. Мне показалось это довольно пророческим в связи с возрастающим интересом к различным смайликам и другим видам более крупных картинок и я подумал: а что если программировать при помощи emoji? Поискав в сети я убедился, что мысль такая уже приходила в головы людей и воплотилась в проект https://github.com/wheresaddie/Emojinal
но этот проект меня не впечатлил, во-первых язык не обладает полнотой и вообще подход автора как попытка заменить часть операторов при помощи emoji показалась не сильно интересной.

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

Так как хотелось предоставить пользователям возможность легко попробовать этот новый язык, было решено сделать его встраиваемым в браузер. В качестве языка компилятора можно было выбрать любой язык, который компилируется в JavaScript, но я выбрал просто JavaScript и решил написать так, чтобы это можно было компилировать как в окружении node.js, так и в браузере. Второй момент, которого мне бы хотелось достичь это изменяемость набора emoji, я уже с первых операций начал сомневаться в том, что выбор emoji-представления действительно однозначен и решил сделать всё так, чтобы другому разработчику было просто заменить этот набор символов и посмотреть какими получаются новые emoji-программы. По этой причине все примеры с тестами записываются в виде шаблонов, в которые подставляется текущий набор.

В качестве языка для описания грамматики я выбрал PEG, единственная проблема с ним была в том, что unicode-символы не получалось сделать перечислением в условиях (пришлось отдельно перебирать первый и второй символ, потому что для него это несколько символов). Плюс возникла сложность связанная с перекомпиляцией PEG-парсера, поскольку приходилось бы каждый раз менять определение идентификаторов (выкусывая скобки) и пересобирать парсер при помощи PEG.js, что мне показалось достаточно медленным на стороне браузера. Было принято довольно простое решение — перед подачей программы на лексический анализ заменять текущие символы скобок из набора на обычные скобки, а потом уже парсить с обычными скобками. Получился такой PEG:
start
  = s:sexpr* {return {type:"Program", body:s}}

leftBracket
  = "("

rightBracket
  = ")"

identifier
  = [\uD83D][\uDC36-\uDE4F]
  / [\uD83D][\uDE80-\uDEC5]
  / [\uFE0F]
  / [\u2702-\u27B0]
  / [\u24C2]
  / [\uD83C][\uDC04-\uDFE2]
  / [\u20E3-\u3299]

number
  = [0-9]+

_ "whitespace"
  = [\t\v\f \n\u00A0\uFEFF]*

sexpr
  = a:atom { return a; }
  / list

list
  = leftBracket _ head:sexpr
    tail:(_ sexpr)* _ rightBracket _ {
      var result = [head];
      for (var i = 0; i < tail.length; i++) {
        result.push(tail[i][1]);
      }
      return {type: 'List', contents:result};
    }

atom
  = d:number _ { return {type: 'Literal', value: parseInt(d.join(""), 10)}}
  / '"' d:(!'"' [a-z])* '"' _ { return {type: 'Literal', value: d }}
  / s:identifier _ { return {type: 'Identifier', name: s.join?s.join(""):s}}


Дальше-проще: я выбрал набор функций, которые вошли в простенькую стандартную библиотеку, это:

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

Так выглядит программа, вычисляющая саму себя:

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

Так выглядит программа для чисел Фибоначчи:

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

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

В процессе выяснил, что emoji не так уж хорошо поддерживаются, к примеру, sublime позволяет копировать только некоторые из них, если попытаться скопировать текст программы вычисляющей саму себя, в буфере обмена будет пусто. Из десктопных браузеров более-менее нормально emoji поддерживаются Safari. Компиляор поддерживает emoji в виде unicode-символов и есть даже repl но писать терминал тоже не слишком хорошо поддерживает такие символы, они наступают друг на друга, но надеюсь что в будущем ситуация улучшится и мы сможем спокойно писать вызовы эмоджи-утилит прямо в командной строке.

Все исходники доступны на https://github.com/parsifal-47/emojilisp, там можно расширить стандартную библиотеку или написать запрос на это, кроме того, можно попробовать свои силы в программировании на этом простом наборе функций по адресу emojilisp.com. И как я писал в самом начале, мне хотелось, чтобы можно было переопределять набор emoji соответствующих функциям без особого труда. Это можно сделать поменяв файлы в папке conf проекта на github или нажав кнопку «create your own set» на сайте, после чего сетом, как и любой программой можно поделиться. Вот, к примеру, вариант с более интересным символом для операции list.

Кроме того, появилась сложно проверяемая идея о том, что такой язык возможно будет легче понимаем детьми и возможно каким-то таким будет программирование будущего.
@parsifal
карма
26,0
рейтинг 24,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

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

  • +10
    «Идея о том, что такой язык возможно будет легче понимаем детьми» — скорее всего очень ошибочна.
    • –1
      Трудно сказать — пробовать надо. Совершенно не очевидно на самом деле.

      Дело в том, что любые новые… Не знаю как назвать — концепции/парадигмы человек усваивает через призму того знания, которое у него уже есть… Если никаких усвоенных представлений о том же программировании нет — внезапно может оказаться, что все очень просто и понятно. А смайлики хороши тем, что они же еще и подобраны со смыслом… Только надо немного пересмотреть сет… Что бы за пиктограммками именно смысл был (причем для ребенка, который не в теме)… Ну не знаю как-то так: emojilisp.com/set/fDGq3s4aBBTzTzHC

      В общем, попробую на ребенке при случае!
    • +1
    • 0
      Согласен. car и cdr должны отображать свою суть, а не своё название на том синтаксисе, от которого автор пытается избавиться.
  • +3
    Интересная идея в целом, но мне кажется, она не для детей. У картинок слишком велик отвлекающий фактор.
  • +4
    Что только не придумают люди, чтобы другим людям не изучать программирование :)
    ИМХО, лучше обычного алфавита, из которого можно составлять синтаксис, пока ничего не придумали, т.к. не все можно выразить пиктограммами так же емко и просто, как обычными словами алфавита.
    А дети при обучении просто не поймут логику, им захочется разместить картинки так, чтобы было красиво, а не так, что нужно составить формализованный алгоритм для «foreach ($a as $v) { for ($i=0; $i<count($n); $i++) { if (($v%3) == TRUE) { $j[$m] = $v.$n; }}}».
    Только ИМХО.
  • +2
    Класс! Только, похоже, у вас синтаксическая ошибка в коде: оператор собачка с коричневым пятнышком не определен. :)
    • 0
      Это, похоже, просто переменная.
      • +2
        Да, точно, там их три: собачка, хрюша и кошечка.
  • +1
    История развивается по спирали — вот уже и иероглифы переизобретаем на новом уровне =)
  • 0
    А мне понравилось! Я как-то все время испытывал сложность с функциональными языками, т.к. видимо за всевозможными наворотами никак не мог парадигму рассмотреть, а тут… Вроде как-то вырисовывается! И кстати вполне вероятно, что дети смогут уловить суть (как человек не отягощенный глубокими знаниями в теме говорю! )) ). А вот вопрос: тот же айфон — он Emoji (и кстати сегодня pebble презентовали поддержку оных в новой прошивке), я из сафари могу сразу набирать все это, только вот цифры что бы вбить — надо переключится на обычный ввод… А нельзя цифры вводить тоже из набора эмоджи? И вообще — чуток причесать, и я бы себе такое приложение скачал за доллар! ))

    В общем идея, на мой взгляд, стоящая — нужно немного развить и главное — не перегружать функциональностью! Иначе смысл теряется… Нужно что-то очень небольшое, но понятное…
    • 0
      цифры можно тоже сделать из набора emoji, но мне совсем не понравилось как они выглядят в Sublime, там цифра и ободок вокруг неё отдельно
      • 0
        Ну… )) Одно дело, как выглядит, а другое дело — вопрос usability. ) Переключать раскладку неудобно… Хотя бы опционально — стоило бы включить.
    • 0
      И кстати вполне вероятно, что дети смогут уловить суть [функционального программирования]
      Я думаю, его суть лучше улавливать с помощью ML-подобных языков. Выразительный синтаксис, отлично накладываются на математическую нотацию. А Лиспы не более «функциональны», чем какой-нибудь Питон.
    • 0
      (⌘ (! n) (∴ ↺ ((ℙ 0) (n n)) (⌥ (≤ n 1) 1 (↺ (× ℙ n) (− n 1)))))
      (╱! (ι 5)) ⇨ (1 2 6 24 120)

      Ой, то есть (×/⍳)¨⍳5.
      • 0
        Что это?
        • 0
          Факториал же.
  • 0
    А cdr правильно работает? Оно же не последний должно возвращать, а все кроме первого, разве нет?
    • 0
      действительно ошибся, исправлю
  • +1
    Где тэг «ненормальное программирование»?

    Подозревал, что лисп написан древними египтянами.
  • +2
    шизофрению можно заработать, читая такую программу. бжж
  • 0
    Не понимаю, как простая замена лексем на пиктограммы может упростить детям понимание ЯП: сложность ЯП не изменилась, изменился только внешний вид. Детям совершенно не обязательно знать car, cdr и т.п., даже если они представлены всякими там собачками да кошечками. Им куда проще будет работать просто со списками, ассоциативными массивами и деревьями, если они будут представлены отдельными типами, чем если им придётся конструировать их вручную из pair. Опять же, представление кода как данных детям тоже не нужно, так что можно обойтись без скобочек, которые будут только отвлекать. lambda, quote, eval — всё это взорвёт ребёнку мозг, он потом долго будет считать программирование какой-то заумной фигнёй для яйцеголовых.

    Короче, джля детей нужно проектировать специальный упрощённый ЯП, без лишних фич, немногословный, минималистский донельзя. За основу можно взять смесь Python и Haskell:

    это Кот:
      сытость = 100
      может мяукать:
        напечатать "Мяу!"
      может мурлыкать:
        напечатать "Мурлык-мурлык!"
      может ходить(сколькоШагов):
        сытость = сытость - сколькоШагов
        если сытость меньше сколькоШагов:
          сытость = 0
        если сытость равно 0:
          мяукать
      может естьКорм(сколькоШариков):
        сытость = сытость + сколькоШариков
        если сытость больше 100:
          мурлыкать
    
    Вася = сделать Кот
    Вася ходить 30
    Вася мяукать
    Вася ходить 70
    Вася кушать 100
    

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

    Короче, тут нужна большая серьёзная работа с привлечением детских психологов.
    • +1
      В этом направлении работ ведется много — взять тот же Snatch, и его облегченную (sic!) версию для айпад…

      Здесь другое… Это не обучение программированию — это… Ну как головоломка, что ли. Игра. Это не столько просто (в том понимании, которое вы вкладываете) — это как раз наоборот — весьма нетривиально. Просто только в смысле количества лексем.

      Многие думают, что дети не хотят заниматься программированием, потому, что им сложно. А зачастую им не сложно — им скучно. Ибо вот эти вот Вася ходить, Вася кушать — это все несколько… Банально, что ли! Они это все могут, они не понимают — зачем! )

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

      Впрочем я согласен наверное на счет lambda, quote, eval, а так же скобочек… Однако сама по себе идея некоего эзотерического языка на основе пиктограмм мне кажется занимательной. Долже ли это быть лисп — вопрос. Эта версия мне нравится!
  • 0
    Относительно терминала: он тут не причём. Просто в испольемом вами шрифте нет нужных символов и fontconfig (или что у вас там) берёт их из другого шрифта. Я не знаю, почему при этом нельзя отмаштабировать символы, чтобы они занимали одну ячейку, но это вопрос к авторам библиотеки, отображающей шрифт, а никак не к терминалу: чтобы исправить эту досадную проблему авторам терминала пришлось бы написать свою библиотеку для отображения текста.
  • 0
    Эта парадигма очень подойдёт для языка J.
    Там код трудночитаем, но если заменить закорючки иконками, то всё будет супер.

    Может быть вы знаете какой-то редактор, где можно определить автозамену при сохранении пиктограммного текста на ASCII-символы?
    А при считывании автозамену определённых комбинаций на пиктограммы.

    Сама идея — отличная. Посмотрите на язык APL — так в 60-х делали визуальное программирование. Там Айверсон придумал нотацию при которой скобки почти не нужны — это очень укоротило текст программ.
    • 0
      Апл, как раз, был предшественником джея. И что один, что другой — плохо читаемы, потому что идиома на идиоме идиомой погоняет.

      В 60-е годы не было единого представления о шрифтах, поэтому отрывались со спецсимволами почём зря.
      Но когда вместо синуса-косинуса надо писать 1O, 2O и т.п. — это изврат.

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