Labubu

From Esolang
Jump to navigation Jump to search
LABUBU
Paradigm(s) (esoteric, interpreted)
Designed by Digitpink
Appeared in 2025
Computational class (Finite state machine)
Major implementations JavaScript
Influenced by Lua

LABUBU

LABUBU is a minimal, playful esoteric programming language inspired by Labubu toys. It supports only two commands:

  • popmart – assignment
  • labubu – output

LABUBU programs are plain text files. Each line either assigns a literal to a variable or prints one or more values to the screen.

Syntax

Assignment

Use:

popmart <em>identifier</em> = <em>literal</em>
  • identifier must start with a letter and may contain letters, digits, or underscores.
  • literal is either:
 * a number (integer or float), e.g. 42, -3.14  
 * a string in single or double quotes, e.g. "hello", 'world'  

Output

Use:

labubu(<em>expr1</em>, <em>expr2</em>, …)
  • Each expr may be an identifier, a number literal, or a string literal.
  • Values are printed separated by spaces, followed by a newline.

Lines that do not match either form will produce an “Unknown command” error at runtime.

Semantics

  • Variables are dynamically typed and stored in a global environment.
  • Assignment binds the given literal to the variable name.
  • Output resolves each expression:
 * If it matches a defined variable, its value is printed.  
 * Number and string literals are printed directly.  
 * Otherwise the raw token is printed.  

Example

Here is a simple LABUBU program:

popmart x = 123
popmart y = "Hello"
popmart z = 'world'
labubu(x, y, z)
labubu("The answer is", x)

Produces:

123 Hello world
The answer is 123

Implementation

Below is a minimal HTML + JavaScript interpreter. Save this as .html and open in your browser to try LABUBU:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>LABUBU Interpreter</title>
  <style>
    body { font-family: monospace; padding: 1em; }
    textarea { width: 100%; height: 200px; }
    #output { background: #222; color: #eee; padding: 1em; margin-top: 1em; white-space: pre-wrap; }
    button { margin-top: 0.5em; }
  </style>
</head>
<body>
  <h1>LABUBU Interpreter</h1>
  <textarea id="code" placeholder="Write LABUBU code here…"></textarea><br>
  <button onclick="runLabubu()">Run</button>
  <div id="output"></div>

<script>
  const vars = {};
  function runLabubu() {
    const lines = document.getElementById('code').value.split('\n');
    document.getElementById('output').textContent = '';
    for (let raw of lines) {
      let line = raw.trim();
      if (!line) continue;
      if (line.startsWith('popmart ')) {
        const m = line.match(/^popmart\s+([A-Za-z_]\w*)\s*=\s*(.+)$/);
        if (m) {
          let v = m[2].trim();
          if ((v.startsWith('"') && v.endsWith('"')) || (v.startsWith("'") && v.endsWith("'"))) {
            v = v.slice(1, -1);
          } else if (!isNaN(v)) {
            v = Number(v);
          }
          vars[m[1]] = v;
          continue;
        }
      }
      if (line.startsWith('labubu(') && line.endsWith(')')) {
        let args = parseArgs(line.slice(7,-1));
        let out = args.map(tok => {
          tok = tok.trim();
          if (vars.hasOwnProperty(tok)) return vars[tok];
          if ((tok.startsWith('"') && tok.endsWith('"')) || (tok.startsWith("'") && tok.endsWith("'"))) {
            return tok.slice(1,-1);
          }
          if (!isNaN(tok)) return Number(tok);
          return tok;
        });
        document.getElementById('output').textContent += out.join(' ') + '\n';
        continue;
      }
      document.getElementById('output').textContent += `Unknown command: ${line}\n`;
    }
  }
  function parseArgs(s) {
    let res = [], cur = '', inQ = false, q = '';
    for (let c of s) {
      if (inQ) {
        cur += c;
        if (c===q) inQ = false;
      } else {
        if (c==='\"'||c==="'") { inQ=true; q=c; cur+=c; }
        else if (c===',') { res.push(cur); cur=''; }
        else cur+=c;
      }
    }
    if (cur) res.push(cur);
    return res;
  }
</script>
</body>
</html>

See also

Language list