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
]]>