LOLCODE

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 11:55, 2 июня 2016.
LOLCODE
LOLCode logo.png
Парадигма эзотерический
Спроектировано Адам Линдси
Первый   появившийся 2007
Расширение файла .lol, .lols
Влияние
Iolcats

LOLCODE - это эзотерический язык программирования созданный под влиянием интернет-мема о lolcat-ах (намеренно неграмотные подписи к картинкам с котами). Язык был создан в 2007 году исследователем университета Ланкастера Адамом Линдси (Adam Lindsay).

На официальном сайте находится спецификация этого языка, и, хотя некоторые моменты о приоритете операторов и корректности синтаксиса в ней не описаны, уже существуют несколько работающих интерпретаторов и компиляторов этого языка. Одна из реализаций LOLCODE является Тьюринг-полным языком, так как возможна реализация интерпретатора Brainfuck на LOLCODE.

Лол-коты

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

Многие картинки начали курсировать в Интернете с 2005 года, в том числе и на знаменитой имиджборде 4chan, где по субботним котам (в рубрике «caturday», от англ. cat и англ. Saturday) выкладывались смешные фотографии кошек. Широкой популярности мем добился в начале 2007 года, когда сайт icanhascheezburger.com начал регулярно публиковать подобные картинки.

Фотография кошки чаще всего сопровождается подписью большими белыми буквами шрифтом без засечек (то есть sans-serif)[3]. Подпись используется как комментарий к некой ситуации на фотографии.

Wikipedia-lolcat.jpg

Распространённые формы:

  • I’m in ur <место>, <глагол> ur <предмет>, например I’m in ur Wikipedia, editing ur articles («я в тваей Википедии, меняю тваи стотьи»). Основывается на фразе «I’m in ur base, killing ur doodz» («I am in your base killing your d00ds» — «Я на твоей базе мочу твоих чуваков»), произошедшей из жаргона стратегических игр.
  • I can has <предмет> («магу ли я палучить»), например I can has cheeaburger? («Мона мне чизбургир?»)
  • <Тема>. U r doin it rong (<Тема> Ниправильный падход.)
  • I made you a <предмет>, but they <глагол> it, например I maded u a picsher, but they deleted it («Я зделал тибе кортинку, но они стёрли её»). Предположительно произошли от фотографии котёнка, с виноватым видом стоящего на задних лапах, сопровождавшейся текстом «I made you a cookie. But I eated it» («Я сделал тебе пиченьку. Но потом её съел»)
  • Invisible <предмет> («невидимый предмет»), например Invisible bike или Invisible sandwich. Обычно добавляется к картинке с фотографией кота в неестественной позе, как будто он держит какой-то предмет (например, сэндвич).

Спецификация

Все LOLCODE программы должны начинаться с ключевого слова HAI. После него должна следовать текущая используемая версия языка. Программа заканчивается указанием ключевого слова KTHXBYE.

Однострочные комментарии начинаются с BTW

I HAS A VAR ITZ 12          BTW VAR = 12

Многострочные комментарии начинаются с OBTW и заканчивается TLDR. Также необходимо, чтобы оно начиналось с новой строки и с новой табуляцией:

I HAS A VAR ITZ 12
    OBTW this is a long comment block
         see, i have more comments here
         and here
    TLDR
I HAS A FISH ITZ BOB

Переменные

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

Идентификаторы в LOLCODE являются регистро-зависимыми. Они должны начинаться с буквы и могут включать помимо букв еще и цифры и символы подчеркивания. Например, "cheezburger", "CheezBurger" и "CHEEZBURGER" - это три разных идентификатора.

Для объявления переменных используется ключевая последовательность I HAS A, за которой следует идентификатор переменной. Чтобы задать значение переменной при инициализации необходимо поставить ITZ между идентификатором и значением. Для того чтобы присвоить значение после инициализации используется оператор R.

I HAS A var            BTW 'var' is null and untyped
var R "three"          BTW 'var' is now a YARN and equals "three"
var R 3                BTW 'var' is now a NUMBR and equals 3

Типы

На данный момент в LOLCODE имеются следующие типы: строки (YARN), целые числа (NUMBR), числа с плавающей запятой (NUMBAR), и логический (TROOF) (Массивы (BUKKIT) зарезервированы для будущих версий). Типизация является строгой динамической, как у языка python. До тех пор, пока переменной не задано явное значение, она остается бестиповый (NOOB).

Бестиповый тип (NOOB) нельзя неявно приводить ни к какому другому типу, за исключением логического (TROOF). Приведение к TROOF дает в результате FAIL. Выполнение любых операций, которые ожидают некий тип, а получают NOOB приводят к ошибке времени выполнения. Явное приведение дает в результате ноль или пустое значение.

Значениями логического типа являются WIN (истина или true) и FAIL (ложь или false). Пустая строка (обозначается как ""), пустой массив, числовой ноль

Есть еще один тип, который называется TYPE и принимающий как значение только TROOF, NOOB, NUMBR, NUMBAR, YARN, и TYPE. Переменные этого типа могут быть явно приведены к строке или логическому значению (все WIN, кроме NOOB).

Операторы

Операторы и функции в целом полагаются на префиксную нотацию. Таким образом для композиции операций нужно использовать минимальное количество группировок. Когда у всех операторов известна арность никаких операторов группировки вообще не требуется. В случае, если оператор имеет переменную арность, её применение ограничивается ключевым словом MKAY. Последний можно заменять на перевод строк.

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

<operator> <expr1> [[[AN] <expr2>] [AN] <expr3> ...] MKAY
Математические операторы
SUM OF <x> AN <y>       BTW +
DIFF OF <x> AN <y>      BTW -
PRODUKT OF <x> AN <y>   BTW *
QUOSHUNT OF <x> AN <y>  BTW /
MOD OF <x> AN <y>       BTW modulo
BIGGR OF <x> AN <y>     BTW max
SMALLR OF <x> AN <y>    BTW min
Логические операторы
BOTH OF <x> [AN] <y>          BTW and: WIN iff x=WIN, y=WIN
EITHER OF <x> [AN] <y>        BTW or: FAIL iff x=FAIL, y=FAIL
WON OF <x> [AN] <y>           BTW xor: FAIL if x=y
NOT <x>                       BTW unary negation: WIN if x=FAIL
ALL OF <x> [AN] <y> ... MKAY  BTW infinite arity AND
ANY OF <x> [AN] <y> ... MKAY  BTW infinite arity OR
Сравнение
BOTH SAEM <x> [AN] <y>   BTW WIN если и только если x == y
DIFFRINT <x> [AN] <y>    BTW WIN если и только если x != y

Ввод-вывод

Печать в стандартный поток вывода (STDOUT) осуществляется оператором VISIBLE. Он обладает бесконечной арностью и конкатенирует все свои аргументы после приведения их к типу строки. Вызов данного оператора заканчивается концом строки или запятой. На данный момент в языке не имеется стандарта для печати в файл.

Для того чтобы получить данные от пользователя используется ключевое слово GIMMEH.

VISIBLE <expression> [<expression> ...]
GIMMEH <variable>

Условия и циклы

Традиционная if / then / else конструкция в своей базовой форме предполагает использование четырех ключевых слов: O RLY?, YA RLY, NO WAI, and OIC. Блок условия начинается с вычисляемого в логический тип выражения и постфикса O RLY?. Блок NO WAI является обязательным. Пример условной конструкции:

BOTH SAEM ANIMAL AN "CAT", O RLY?
    YA RLY
        VISIBLE "J00 HAV A CAT"
    NO WAI
        VISIBLE "J00 SUX"
OIC

Между двумя ветками исполнения можно помещать необязательные конструкции MEBBE <expression>, <code block>, соответствующие else if в других языках.

Для того чтобы организовать switch в LOLCODE можно использовать конструкцию <expression> WTF? OMG. Далее пример:
COLOR, WTF?
  OMG "R"
    VISIBLE "RED FISH"
    GTFO
  OMG "Y"
    VISIBLE "YELLOW FISH"
  OMG "G"
  OMG "B"
    VISIBLE "FISH HAS A FLAVOR"
    GTFO
  OMGWTF
    VISIBLE "FISH IS TRANSPARENT"
OIC

Ключевые слова для организации циклов в текущей реализации не являются стандартом и будут изменяться и добавляться в новых версиях языка. На данный момент для простого цикла с предъусловием используется конструкция IM IN YR <label>.

Функции

Функция в языке LOLCODE может быть задана в следующем виде:

HOW IZ I <function name> [YR <argument1> [AN YR <argument2> …]]
  <code block>
IF U SAY SO

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

Чтобы вернуть из функции значение можно воспользоваться одним из перечисленных способов:

  • FOUND YR <expression> возвращает вычисленное значение.
  • GTFO возвращает NOOB
  • если ничего не указывать, то результат последней инструкции присвоится специальной переменной IT (переменная - состояние программы).

Для вызова функции используется следующая конструкция:

I IZ <function name> [YR <expression1> [AN YR <expression2> [AN YR <expression3> ...]]] MKAY

Реализации

LOLPython — класс для языка Python, позволяющий использовать LOLCODE при написании программы.

LOLCODE.NET — компилятор LOLCODE в MSIL, находящийся в ранней стадии разработки.

Список литературы

  1. Официальный сайт
  2. LOLCODE
  3. Интерпретатор
  4. Спецификация языка v1.2
  5. LOLPython