0,0
рейтинг
17 октября 2012 в 18:18

Разработка → FiM++ перевод

image

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

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

FiM++ является динамически типизированным, интерпретируемым, объектно ориентированным и полным по Тьюрингу языком для написании писем Принцессе Селестии от лица любой из пони (Я использовал Twilight для моей спецификации). Функции в языке форматируются как параграфы письма. Это сделано для того, чтобы код мог легко читаться и быть максимально похожим на письмо. Каждое такое письмо является классом, так что каждая программа может состоять из нескольких писем, если пользователь того захочет. Однако, минимально интерпретируемая единица — это класс, почти как в Java. Язык не поддерживает библиотеки, так как мы посылаем письма, а значит код должен быть максимально лёгким. Нужные типы данных могут определяться пользователем.

Каждый класс начинается с заголовка, который всегда одинаков:
Dear Princess Celestia: Letter One


Операторные скобки для частей кода были убраны, так как они нарушают формат письма, но могут быть использованы при желании пользователя.Они не будут упоминаться в дальнейшем, вместо них используются отступы, почти как в Python. «Princess Celestia» является зарезервированным ключевым словом для создания класса и поэтому всегда должна быть первым получателем. 'Letter One' — это название класса.

Интерфейсы могут быть добавлены в первую строку заголовка класса через запятую:
Dear Princess Celestia, and Princess Luna, and Princess Cadance: Letter One


Каждый интерфейс определяется параграфами (функциями), которые должны находиться внутри класса. Вызывается обычный класс так:
I wrote you another letter! It's titled Letter Two.


'Letter Two' теперь иллюстрируемый объект и может быть использован как таковой; например, он может быть использован для переноса функции из нового класса в текущий. В нём так же может быть объявлен объект для дальнейшего использования в коде:
I wrote you another letter!

// code 
// code

Oh, about that other letter. It's titled Letter Two!


Функция «main» выглядит так:
Today I learned 
	// code
	// code
	Your faithful student, Twilight Sparkle.


Она никогда не принимает аргументов, таких как, например, аргументы командной строки. Возврат значения состоит из строки «Your faithful student, » и аргумента, коим является имя. Возврат значения может быть не нужен, в зависимости от интерпретатора.

Любая другая функция выглядит так:
I learned about ducks
// code
// code	


Она вызывается по имени, в этом случае 'friendship'. Возврат значений не является строго необходимым и может быть проигнорирован. Конечно же функция может быть вызвана с параметрами:
I learned about friendship with Spike and Rarity
// code
// code


«Spike» и «Rarity» теперь могут быть использованы внутри функции. Все аргументы передаются магическим образом (так, на всякий случай).

Ключевое слово «I» работает как оператор «self» в большинстве языков. Однако он ссылается не на экземпляр класса, а на писателя письма. Он может быть определён где угодно.

Присваивание переменный выглядит так:

Did you know that Spike is a dragon?


В этом примере мы присваиваем переменной «Spike» строковое значение «dragon». У Spike также могло бы быть любое другое значение, а точный тип данных определяется во время выполнения программы.

Несмотря на то, что язык динамически типизирован, определённые проверки всё равно выполняются при операциях с двумя переменными. Если кто-то напишет что-то вроде «Pinkie Pie идёт на свидание с числом», то интерпретатор должен будет выдать исключение, в этом случае — RidiculousException.

Циклы в FiM++:
I did this 100 times…
// code
// code	

Этого должно быть достаточно для того, чтобы написать интерпретатор данного языка. И ещё кое-что: зарезервированное ключевое слово «friendship» всегда должно интерпретироваться как «magic», иначе вы рискуете нарушить основы правила Вселенной, в которой находится Эквестрия.

Hello world

Dear Princess Celestia: Hello World!

Today I learned how to say Hello World!
I said “Hello World”!
That’s all about how to say Hello World!

Your faithful student, Twilight Sparkle.


Ссылки

Документ, в котором описана текущая спецификация языка
Простенький JavaScript интерпретатор
Пример кода: 99 Jugs of Cider
Перевод: Cereal Velocity
Константин Богданов @thevar1able
карма
84,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

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

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

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

  • +9
    Когда уже третий сезон выйдет?)
    • +4
      В ноябре. Когда именно — неизвестно.
    • +4
      3 ноября по идее.
    • +22
      Расскажите, в чём фишка пони, почему от них так прутся?
      • 0
        Посмотрите, сами поймете :)
      • НЛО прилетело и опубликовало эту надпись здесь
      • НЛО прилетело и опубликовало эту надпись здесь
      • +1
        Думаю, что это сериал «типа для маленьких девочек», но с толстым подтекстом и кучей шуток, понятных только взрослым. Смотреть не смотрел, предполагаю.
      • +3
        => Расскажите, в чём фишка пони, почему от них так прутся?
        1. Доброта!
        2. Набор главных героинь и второстепенных персонажей, каждый из которых обладает очень живым характером. Говоря проще, каждый\каждая пони обладает очень сдвинутой к определенному экстриму личностью с кучей психологических проблем и стереотипов. Психологические проблемы и стереотипы не мешают поням наслаждаться жизнью, дружить и любить. Для любого зрителя, с большой вероятностью одна или несколько основных героинь будет похожи характером именно на него, и он начнет им сопереживать.
        3. Отличная анимация и вижуалы, музыкальные вставки.
        4. Доброта!

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

          Поэтому (несмотря на возрастной рейтинг «без ограничений») сериал можно смотреть начиная разве что со школьного возраста. Мы сделали ошибку, разрешив смотреть этот мультфильм нашей 3-летней дочери и, будьте уверены, она копирует рычание (и выражение «лица» пони при рычании) со 100% достоверностью, уверенно цитирует все гневные выкрики этих эмоционально неуравновешенных существ и носится по квартире, опрокидывая всё и крича «Я — Радуга! Я лечу!» Но ни разу ещё мы не видели воспитательного эффекта тех последних морализаторских 5-секундных фраз. Скажу вам больше, каждый раз, когда серия подходит к концу, дочь просто переключается на следующую, не дожидаясь воспитательной нудятины =)

          Так-то, конечно, мультики прикольные и нарисовано хорошо, и даже русская озвучка неплоха. «Кучи шуток, понятных только взрослым» там нет, но целевая возрастная аудитория явно включает в себя и последние классы школы, проблемы этих пони — больше проблемы тинейджеров, чем дошкольников.
  • +13
    Coding is magic.
    • +7
      image
  • +30
    image
  • +4
    Если есть ++, то должен быть и просто plain FiM?
  • +9
    COBOL наносит ответный удар няшками и пони?
  • 0
    Когда уже выпустят HyperText Mare Language 5?

    Если кто пропустил, у меня был удачный топик про HTML5 Canvas и пони
    • –3
      HyperText Mare Language? Может, HyperText Markup?
      • +4
        В MLP:FiM все названия немножко переделываются по-лошадиному.
        Ваш Кэп.
  • +3
    • +12
      Скопипащу на всякий случай.
      Пример на python:
      def swap(arr, i, j):
        arr[i], arr[j] = arr[j], arr[i]
      
      def bubble_sort(arr):
        i = len(arr)
        while i > 1:
         for j in xrange(i – 1):
          if arr[j] > arr[j + 1]:
           swap(arr, j, j + 1)
         i -= 1
      


      А теперь FiM++
      Скрытый текст
      Dear Princess Celestia: Bubble sorting is magic!
      
      Today I learned some code magic.
      
      Did you know that My Spells is a numbers? On the 1 page of the book “My Spells” I wrote 4. On the 1 page of the book “My Spells” I wrote 6. On the 1 page of the book “My Spells” I wrote 3. Did you know that bookpages is a number 3?
      
      I learned swapping two pages using Spell book using first page number using second page number. Did you know that temporary note likes number? On the first page of the book “Spell” I read about temporary note. On the first page of the book “Spell” I wrote I knew about on the second page of the book “Spell” I read about. On the second page of the book “Spell” I wrote I knew about temporary note. That’s all about swapping two pages!
      
      I learned spell sorting using Spell book using bookpages. Did you know that counter is a number 1? Here’s what I did while bookpages greater than 1: as long as counter no more than bookpages subtract 1, when on the counter page of the book “Spell” I read about more than on the counter and 1 page of the book “Spell” I read about, swapping two pages using Spell using bookpages – that’s what I would do; counter likes number the 1 added to counter. That’s what I did, bookpages is the bookpages subtract 1, that’s what I did. Then you get the Spell! That’s all about spell sorting!
      
      Spell sorting using My Spells using bookpages.
      
      Your faithful student, Orhideous.
      

      Не знаю, как интерпретатор относится к типографике.
      • +3
        Отличный способ обфускации кода.
  • +8
    Теперь понятно что такое ФИМоз головного мозга
  • +14
    ./configure
    make
    make friends
  • +4
    Зашёл в топик, потому что думал: ну очень тупое что-то, а оказалось — божественно! Долго так не смеялся!
  • +3
    Эй, а если я хочу писать от имени Rainbow Dash?
    • +1
      Эту фичу добавили только во втором сезоне же?
  • 0
    Все это замечательно, но рабочего интерпретатора нет, как я понимаю?
    Пример с бутылками выдает SyntaxError: Expected «said», «sang» or «wrote» but «l» found.
    Сортировка пузырьком из поста выше: SyntaxError: Expected [A-Z] but «s» found.
    Проверял на scanish.draco.uberspace.de/fim/

    Или же просто код неправильный? В таком случае хотелось бы увидеть рабочие примеры.
    Пост с одной только концепцией языка, к тому же перевод, это как то очень.
    • 0
      Есть более серьезный интерпретатор на scala, который, судя по приложенным примерам, все это умеет. Но у меня бинарники так и не заработали, лично убедиться не могу.
    • 0
      Дело было всего лишь в командной строке. После исправления все работает. Даже примитивный калькулятор с гуем.
      Интерпретатор не любит переводы строк, поэтому пока придется приводить формат. Отформатированные бутылки уже есть в приложенных примерах.
  • –7
    ИМХО, получился типичный извращенский язык, каких сотни.
    Было бы куда интереснее, если бы был разработан язык, который реально можно применить на практике — какой-нибудь минималистичный интерпретатор с C-подобным синтаксисом, пусть даже без подпрограмм, но с элементами MLP. Возможно, в силу специфики, даже набрал бы определённую популярность.
    • 0
      Бритва Оккама по вам плачет
  • 0
    Ну очень сильное колдунство…
    Развлечься хватит =)

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