LOLCODE
- Дата создания:
- 2007
- Парадигма:
- Типизация:
- Принятые расширения файлов:
- *.lol
- Реализации и версии (свернуть все | развернуть все):
LOLCODE — эзотерический язык программирования, созданный под влиянием интернет-мема lolcat.
Язык создан в 2007 году Адамом Линдсеем (Adam Lindsay). Исходное описание языка было достаточно расплывчатым, поэтому существующие реализации значительно отличаются. Для нескольких вариантов языка, например, LOLCode.NET и loljs, доказана Тьюринг-полнота методом написания интерпретатора Brainfuck.
Язык использует элементы англоязычного интернет-сленга, поэтому человек, знакомый с этим сленгом, может разобраться в коде программ даже без знания синтаксиса языка.
Языковые конструкции:
Программа заключена в ключевые слова
HAI
иKTHXBYE
. После словаHAI
может быть указана версия спецификации языка, которая используется в программе, но не указано, как интерпретатор должен ее обрабатывать.Комментарии используют слова
BTW
(комментарий до конца строки) иOBTW ... TLDR
(комментарий, который может занимать несколько строк).I HAS A <varname>
— объявление переменной. LOLCODE динамически типизирован, поэтому нет необходимости объявлять еще и тип переменной.<varname> R <value>
— присвоение переменной значения. В языке есть следующие типы данных:NOOB
(нетипизированный — это значение принимает переменная до того, как она инициализирована),NUMBR
(целое),NUMBAR
(дробное),YARN
(строка) иTROOF
(логический). ТипBUKKIT
зарезервирован на будущее для массивов. Допускается автоматическое преобразование типов.для функций и операторов используется префиксная нотация. Если количество параметров функции может варьироваться, их список должен оканчиваться ключевым словом
MKAY
. Отдельные аргументы могут разделяться словомAN
.математические действия (работают с типами
NUMBR
иNUMBAR
, при необходимости возможно преобразование изYARN
):SUM OF — сложение DIFF OF — вычитание PRODUKT OF — умножение QUOSHUNT OF — деление MOD OF — остаток от деления BIGGR OF — максимум SMALLR OF — минимум
логические действия (работают с типом
TROOF
, принимающим значенияWIN
иFAIL
):BOTH OF — логическое "и" EITHER OF — логическое "или" WON OF — xor NOT — отрицание ALL OF ... MKAY — логическое "и" для произвольного количества аргументов ANY OF ... MKAY — логическое "или" для произвольного количества аргументов
сравнения:
BOTH SAEM
— равенство,DIFFRINT
— неравенство. В настоящее время другие виды сравнения не поддерживаются и должны конструироваться с использованиемBIGGR OF
иSMALLR OF
.SMOOSH … MKAY
— конкатенация строк.MAEK <expression> [A] <type>
— преобразование значения выражения к заданному типу в явном виде. Чтобы изменить тип переменной, можно использовать<variable> IS NOW A <type>
.VISIBLE
— вывод на печать строки или числа. Чтобы вывести произвольное количество аргументов, их следует конкатенировать. По умолчанию вывод заканчивается переводом строки, чтобы избежать этого, нужно добавить!
в конец списка аргументов.GIMMEH
— чтение строки из потока ввода.неявная переменная
IT
используется для хранения значения выражения и его передачи в управляющие конструкции.базовая конструкция if-then-else выглядит следующим образом:
<expression> O RLY? YA RLY <code block> NO WAI <code block> OIC
конструкция case выглядит следующим образом:
<expression> WTF? OMG <value literal> <code block> [OMG <value literal> <code block> …] [OMGWTF <code block>] OIC
Для сравнения используется неявная переменная
IT
и константа. БлокOMG
может содержать произвольное количество команд и заканчиватьсяGTFO
. Если командаGTFO
отсутствует, после выполнения команд блока выполняется следующее сравнение, и т.д.бесконечный цикл:
IM IN YR <label> <code block> IM OUTTA YR <label>
цикл while:
IM IN YR <label> <operation> YR <variable> [TIL|WILE <expression>] <code block> IM OUTTA YR <label>
В цикле используется временная локальная переменная и любая унарная операция для ее изменения, в том числе
UPPIN
иNERFIN
(инкремент и декремент). Выражение используется как условие завершения цикла:TIL
прекращается, когда оно становится истинным (WIN
),WILE
— ложным (FAIL
).объявление функции:
HOW DUZ I <function name> [YR <argument1> [AN YR <argument2> …]] <code block> IF U SAY SO
Возвращение из функции возможно тремя способами.
FOUND YR <expression>
возвращает значение выражения.GTFO
возвращаетNOOB
. Если выполнение функции дошло до ее конца, возвращается значение переменнойIT
.GTFO
— аналог break в других языках; используется для прерывания циклов, case и функций.
Элементы синтаксиса:
Комментарий до конца строки | BTW |
---|---|
Комментарии, которые не могут быть вложенными | OBTW ... TLDR |
Регистрозависимость | да |
Регулярное выражение идентификатора переменной | [a-zA-Z]* |
Присваивание значения переменной | <varname> R <value> |
Объявление переменной | I HAS A <varname> |
Равенство | BOTH SAEM |
Неравенство | DIFFRINT |
Если - то | <expression> O RLY? YA RLY <code block> OIC |
Если - то - иначе | <expression> O RLY? YA RLY <code block> NO WAI <code block> OIC |
Бесконечный цикл | IM IN YR <label> ... IM OUTTA YR <label> |
Ссылки:
Примеры:
Hello, World!:
Пример для версий loljs 1.1HAI
CAN HAS STDIO?
VISIBLE "Hello, World!"
KTHXBYE
Факториал:
Пример для версий loljs 1.1Используется рекурсивное определение факториала.
HAI
HOW DUZ I FACTORIAL N
BOTH SAEM 0 AN N
O RLY?
YA RLY
FOUND YR 1
NO WAI
FOUND YR PRODUKT OF N AN FACTORIAL DIFF OF N AN 1
OIC
IF U SAY SO
I HAS A N ITZ 0
IM IN YR LOOP UPPIN YR N WILE N SMALLR THAN 17
VISIBLE SMOOSH N "! = " FACTORIAL N
IM OUTTA YR LOOP
KTHXBYE
Факториал:
Пример для версий loljs 1.1Используется итеративное определение факториала.
HAI
I HAS A N ITZ 0
I HAS A FACTORIAL ITZ 1
IM IN YR LOOP UPPIN YR N WILE N SMALLR THAN 17
VISIBLE SMOOSH N "! = " FACTORIAL
FACTORIAL R PRODUKT OF FACTORIAL AN SUM OF N AN 1
IM OUTTA YR LOOP
KTHXBYE
Числа Фибоначчи:
Пример для версий loljs 1.1Числа Фибоначчи вычисляются итеративно.
HAI
I HAS A I ITS 0
I HAS A FIB1 ITS 0
I HAS A FIB2 ITS 1
IM IN YR LOOP UPPIN YR I TIL BOTH SAEM I AN 16
VISIBLE SMOOSH FIB2 ", "!
I HAS A FIB3 ITS SUM OF FIB1 AN FIB2
FIB1 R FIB2
FIB2 R FIB3
IM OUTTA YR LOOP
VISIBLE "..."
KTHXBYE
Числа Фибоначчи:
Пример для версий loljs 1.1Числа Фибоначчи вычисляются рекурсивно.
HAI
HOW DUZ I FIBONACCI N
BOTH SAEM 1 AN BIGGR OF N AN 1, O RLY?
YA RLY
FOUND YR 1
NO WAI
FOUND YR SUM OF FIBONACCI DIFF OF N AN 1 AN FIBONACCI DIFF OF N AN 2
OIC
IF U SAY SO
I HAS A N ITZ 0
IM IN YR LOOP UPPIN YR N WILE N SMALLR THAN 16
VISIBLE SMOOSH FIBONACCI N ", "!
IM OUTTA YR LOOP
VISIBLE "..."
KTHXBYE
Квадратное уравнение:
Пример для версий loljs 1.1HAI
HOW DUZ I SQRT X
I HAS A X_N ITZ 10
I HAS A LIMIT ITZ 100
I HAS A COUNTER ITZ 0
IM IN YR LOOP UPPIN YR COUNTER WILE COUNTER SMALLR THAN LIMIT
I HAS A TERM ITZ QUOSHUNT OF X AN X_N
TERM R SUM OF X_N AN TERM
TERM R QUOSHUNT OF TERM AN 2
X_N R TERM
IM OUTTA YR LOOP
FOUND YR X_N
IF U SAY SO
I HAS A AC
GIMMEH AC
AC IS NOW A NUMBR
BOTH SAEM AC AN 0, O RLY?
YA RLY
VISIBLE "Not a quadratic equation."
NO WAI
I HAS A BC
GIMMEH BC
BC IS NOW A NUMBR
I HAS A CC
GIMMEH CC
CC IS NOW A NUMBR
I HAS A D ITZ DIFF OF PRODUKT OF BC AN BC AN PRODUKT OF 4 AN PRODUKT OF AC AN CC
BOTH SAEM D AN 0, O RLY?
YA RLY
VISIBLE SMOOSH "x = " QUOSHUNT OF BC AN PRODUKT OF -2 AN AC
NO WAI
BOTH SAEM 0 AN SMALLR OF 0 AN D, O RLY?
YA RLY
VISIBLE SMOOSH "x1 = " QUOSHUNT OF SUM OF BC AN SQRT D AN PRODUKT OF -2 AN AC
VISIBLE SMOOSH "x2 = " QUOSHUNT OF DIFF OF BC AN SQRT D AN PRODUKT OF -2 AN AC
NO WAI
D R PRODUKT OF D AN -1
VISIBLE SMOOSH "x1 = (" QUOSHUNT OF BC AN PRODUKT OF -2 AN AC ", " QUOSHUNT OF SQRT D AN PRODUKT OF -2 AN AC ")"
VISIBLE SMOOSH "x2 = (" QUOSHUNT OF BC AN PRODUKT OF -2 AN AC ", " QUOSHUNT OF SQRT D AN PRODUKT OF 2 AN AC ")"
OIC
OIC
OIC
KTHXBYE
CamelCase:
Пример для версий loljs 1.1Отметим, что в LOLCODE нет функций работы со строками и символами, кроме конкатенации — например, символы нельзя сравнивать BIGGR OF
или SMALLR OF
или получить их ASCII-коды. Поэтому для определения того, является ли символ буквой, и перевода его в другой регистр приходится создавать “словари” букв и искать в них нужную перебором.
HAI
I HAS A UPP ITZ "QWERTYUIOPASDFGHJKLZXCVBNM"
I HAS A LOW ITZ "qwertyuiopasdfghjklzxcvbnm"
HOW DUZ I LOWER CHAR
I HAS A I ITZ 0
IM IN YR LOOP UPPIN YR I TIL BOTH SAEM I AN LEN OF UPP
BOTH SAEM UPP!I AN CHAR, O RLY?
YA RLY
FOUND YR LOW!I
OIC
IM OUTTA YR LOOP
FOUND YR CHAR
IF U SAY SO
HOW DUZ I UPPER CHAR
I HAS A I ITZ 0
IM IN YR LOOP UPPIN YR I TIL BOTH SAEM I AN LEN OF UPP
BOTH SAEM LOW!I AN CHAR, O RLY?
YA RLY
FOUND YR UPP!I
OIC
IM OUTTA YR LOOP
FOUND YR CHAR
IF U SAY SO
HOW DUZ I ISLOWER CHAR
I HAS A I ITZ 0
IM IN YR LOOP UPPIN YR I TIL BOTH SAEM I AN LEN OF UPP
BOTH SAEM LOW!I AN CHAR, O RLY?
YA RLY
FOUND YR WIN
OIC
IM OUTTA YR LOOP
FOUND YR FAIL
IF U SAY SO
I HAS A TEXT
GIMMEH TEXT
I HAS A CAMELCASE ITZ ""
I HAS A I ITZ 0
I HAS A SPACE ITZ WIN
IM IN YR LOOP UPPIN YR I TIL BOTH SAEM I AN LEN OF TEXT
I HAS A CHAR ITZ LOWER TEXT!I
ISLOWER CHAR, O RLY?
YA RLY
BTW this is a letter (already lowercase), modify depending on SPACE
SPACE, O RLY?
YA RLY
CHAR R UPPER CHAR
OIC
CAMELCASE R SMOOSH CAMELCASE CHAR
SPACE R FAIL
NO WAI
BTW this is space - mark it
SPACE R WIN
OIC
IM OUTTA YR LOOP
VISIBLE CAMELCASE
KTHXBYE
Комментарии
]]>blog comments powered by Disqus
]]>