Exclaim

From Esolang
Jump to navigation Jump to search

Exclaim

Exclaim is a minimalistic esoteric programming language created in 2025 by a young enthusiast with nickname "digitpink". It's inspired by Chicken but focuses on simplicity and memory-based operations using only exclamation marks.

It was designed to be easy to learn, with each command being a specific number of exclamation marks (`!`), and output happens directly to the console.

Overview

Exclaim operates on a tape of cells (like in Brainfuck). Each cell holds an integer. The language has a pointer that can move left or right, and the tape can grow dynamically.

Despite being fully Turing-complete in principle, Exclaim is intentionally useless and minimal, created as a fun experiment. The main goal was to make a language even smaller and simpler in command set and syntax than Brainfuck.

Commands

All commands are sequences of only `!` symbols:

Command Meaning
! Increment value at current cell
!! Decrement value at current cell
!!! Move pointer to the right
!!!! Move pointer to the left
!!!!! Print the current cell index (position)
!!!!!! Print the value at current cell
!!!!!!! Move pointer to the end of tape
!!!!!!!! Move pointer to the beginning of tape
!!!!!!!!! Add a new cell at the end
!!!!!!!!!! Remove the last cell (if more than one exists)
!!!!!!!!!!! Reset memory to a single zeroed cell

Example

This example moves the pointer three times to the right and adds +1 three times. Then prints the current index and value.

!!! !!! !!! ! ! ! !!!!! !!!!!! 

Output:

3
3

Implementation

Below is a simple HTML + JavaScript implementation of the Exclaim interpreter:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Exclaim Interpreter</title>
</head>
<body>
  <textarea id="code"></textarea>
  <button onclick="run()">Run</button>
  <pre id="output"></pre>

  <script>
    function run() {
      const code = document.getElementById("code").value;
      let mem = [0], ptr = 0, out = [];
      let i = 0;
      while (i < code.length) {
        let count = 0;
        while (code[i + count] === "!") count++;
        const cmd = "!".repeat(count);
        switch (cmd) {
          case "!": mem[ptr]++; break;
          case "!!": mem[ptr]--; break;
          case "!!!": ptr++; if (!mem[ptr]) mem[ptr] = 0; break;
          case "!!!!": if (ptr > 0) ptr--; break;
          case "!!!!!": out.push(ptr); break;
          case "!!!!!!": out.push(mem[ptr]); break;
          case "!!!!!!!": ptr = mem.length - 1; break;
          case "!!!!!!!!": ptr = 0; break;
          case "!!!!!!!!!": mem.push(0); break;
          case "!!!!!!!!!!": if (mem.length > 1) mem.pop(); break;
          case "!!!!!!!!!!!": mem = [0]; ptr = 0; break;
        }
        i += count || 1;
      }
      document.getElementById("output").textContent = out.join("\\n");
    }
  </script>
</body>
</html>

See also

Categories