]]> ]]>
Править | Обсудить | История

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.1
HAI
  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.1
HAI
  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

]]>

Работа программистам