Liminal
examples · gallery

28 small programs.

Each one demonstrates a single mechanic.


awaken
▸ open in playground

A meaningless scatter of letters across five rows. Each character falls straight down in its own column; the bottom row assembles into a valid print statement. Prints 'wake up'.

source
   nt  w  e   "
 r           p
p       a
  i
      "  k  u

settled




print "wake up"
stdout wake up
descend
▸ open in playground

Characters strewn over five rows with no apparent order. Gravity drops each column independently and the floor becomes the program. Prints 'it falls into place'.

source
          f   s    o   a
  int "it   l    n    l
pr           l       p  c
                i        e"
           a      t

settled




print "it falls into place"
stdout it falls into place
assemble
▸ open in playground

Pure noise until it lands. Every column settles to the bottom and the settled row parses as one print. Prints 'assembled from chaos'.

source
             le    o    a
p     "  s  b       m ch
   n           d
 ri t  a          r      os
        s em     f         "

settled




print "assembled from chaos"
stdout assembled from chaos
collide
▸ open in playground

co and de sit at opposite ends of one row. Matched wind fields push the two halves toward each other; they land adjacent and stack into 'code', which four @[] reads recover. Prints 'merged: code'.

source
     co                            de
>>>>>>> >>>>>>>          <<<<<<< <<<<<<<
>>>>>>> >>>>>>>          <<<<<<< <<<<<<<

###################################################
print "merged: " + @[3, 19] + @[3, 20] + @[3, 21] + @[3, 22]
settled


                   code
###################################################
print "merged: " + @[3, 19] + @[3, 20] + @[3, 21] + @[3, 22]
stdout merged: code
redact
▸ open in playground

Five letters drop onto a wall pierced by narrow gaps. The wall acts as a censor — only the letter aligned with a gap reaches the floor. @[] reads it back. Prints 'got through: L'.

source
H E L L O
####  ####

#############################
print "got through: " + @[2, 4]
settled
H E   L O
####  ####
    L
#############################
print "got through: " + @[2, 4]
stdout got through: L
funnel
▸ open in playground

Four letters fall onto a wall with a single gap. Only the one above the gap passes through to the floor below; the rest rest on the wall. @[] recovers the survivor. Prints 'fell through: B'.

source
A   B   C   D

####  ##############

####################
print "fell through: " + @[3, 4]
settled
A       C   D
####  ##############
    B
####################
print "fell through: " + @[3, 4]
stdout fell through: B
bounce
▸ open in playground

A piece crosses a wind field that pushes it right, drifts, then crosses a second field that pushes it back left. It settles at its original column. @[] reads it. Prints 'bounced back to: X'.

source
        X
>>      >>


    <<      <<

####################################
print "bounced back to: " + @[5, 8]
settled




        X
####################################
print "bounced back to: " + @[5, 8]
stdout bounced back to: X
tower
▸ open in playground

Seven letters on seven rows all fall into column 0 and pile into a stack. Earlier rows rest lowest, so reading the column bottom-up recovers 'Liminal'. Prints 'tower: Liminal'.

source
L
i
m
i
n
a
l
###############################################################
print "tower: " + @[6,0] + @[5,0] + @[4,0] + @[3,0] + @[2,0] + @[1,0] + @[0,0]
settled
l
a
n
i
m
i
L
###############################################################
print "tower: " + @[6,0] + @[5,0] + @[4,0] + @[3,0] + @[2,0] + @[1,0] + @[0,0]
stdout tower: Liminal
dropbox
▸ open in playground

Four letters drop onto an alternating wall of pegs. Some are caught on top; others slip between pegs and settle deeper. A read from column 0 recovers the letter that was blocked. Prints 'left of gap: A'.

source
A   B   C   D

#  #  #  #  #  #
###################
print "left of gap: " + @[1, 0]
settled
A           D
#  #B # C#  #  #
###################
print "left of gap: " + @[1, 0]
stdout left of gap: A
drift-cancel
▸ open in playground

A drifting piece marches sideways until a wall blocks its diagonal step; the drift is cancelled and it falls straight down. @[2, 23] reads where it landed. Prints 'X stopped at col X'.

source
<§drift=+5 §>X

                            #
##############################################
print "X stopped at col " + @[2, 23]
settled

                       X    #
##############################################
print "X stopped at col " + @[2, 23]
stdout X stopped at col X
gravity
▸ open in playground

Three prints, no walls. Each row falls and stacks intact; the interpreter reads the grid bottom-up, so the earliest source row runs first. Prints 'one', 'two', 'three' in source order.

source
print "one"
print "two"
print "three"







settled






print "three"
print "two"
print "one"
stdout one two three
pythagoras
▸ open in playground

Two legs as let-bindings on their own rows, a print above them. All three rows settle into one shared program; the print sees a and b defined below it. Prints '25'.

source
let a = 3
let b = 4
print (a*a)+(b*b)




settled



print (a*a)+(b*b)
let b = 4
let a = 3
stdout 25
concat
▸ open in playground

A let row binds a joined string; the print row above it reads that variable back. Two rows, one environment. Prints 'hello, world'.

source
let phrase = "hello, " + "world"
print phrase




settled



print phrase
let phrase = "hello, " + "world"
stdout hello, world
email
▸ open in playground

Six pieces scattered across six rows. They fall and stack into a single line that reads as one print statement. Prints 'helge@example.com'.

source
print
        "helge"
                +
                  "@"
                       +
                          "example.com"
#############################################
settled




print   "helge" + "@"  +  "example.com"
#############################################
stdout helge@example.com
grid-letter
▸ open in playground

Two @[r, c] references pluck letters straight out of the settled grid and concatenate them. The program reads its own surface. Prints 'hi'.

source
hi
####
print @[0,0]+@[0,1]







settled
hi
####







print @[0,0]+@[0,1]
stdout hi
spell
▸ open in playground

Three @[r, c] lookups read letters out of the grid and concatenate them into a word. Prints 'cat'.

source
cat
####
print @[0,0]+@[0,1]+@[0,2]







settled
cat
####







print @[0,0]+@[0,1]+@[0,2]
stdout cat
echo
▸ open in playground

A single letter sits in the grid as data; @[0, 0] reads it back into a print. Prints 'echo:h'.

source
h
####
print "echo:"+@[0,0]







settled
h
####







print "echo:"+@[0,0]
stdout echo:h
caesar
▸ open in playground

An entire print line drifts three columns right and still parses as one statement; @[1, 16] reads the first character of the shifted line itself. Prints 'shifted by 3, first char = p'.

source
<§drift=+3 §>print "shifted by 3, first char = " + @[1, 16]

####################################################################
settled
                print "shifted by 3, first char = " + @[1, 16]
####################################################################
stdout shifted by 3, first char = p
scoped
▸ open in playground

<§drift=+N§>{…} shifts only what's inside the braces. The 'hi' string slides right while the let scaffolding around it stays put; the line still parses and runs. Prints 'hi'.

source
let value = <§drift=+5 §>{"hi"}
print value
##################################
settled
print value
let value =               "hi"
##################################
stdout hi
hello
▸ open in playground

A one-row program. There is nowhere to fall. The baseline: the bottom of the grid is a small expression language. Prints 'hello, liminal'.

source
print "hello, liminal"









settled








print "hello, liminal"
stdout hello, liminal
rectangle
▸ open in playground

Width times height — the smallest multi-step calculation, evaluated as the one settled row. Prints '15'.

source
print(5*3)









settled








print(5*3)
stdout 15
drift-left
▸ open in playground

A negative drift carries a whole print line three columns left as it falls. It stays contiguous, so it still parses. Prints 'drift-left'.

source
<§drift=-3 §>print "drift-left"









settled








 print "drift-left"
stdout drift-left
wind
▸ open in playground

A strength-1 wind field nudges a falling print one column right before it lands. The shift closes the gap but the statement survives. Prints 'blown'.

source
print "blown"
>           >








settled








 print"blown"
stdout blown
drift
▸ open in playground

Cautionary demo: a +1 drift on a whole print row shears its operand off onto another row as the line falls. The remaining fragment no longer parses — it errors with 'expected expression'. Spatial code can break itself.

source
<§drift=+1 §>print "drift"









settled
                   "drift"







                     print
notes
expected expression
shelf
▸ open in playground

A wall catches a drifting piece and it stacks on top. Pure physics — watch it in the playground; it produces no output.

source
<§drift=+1 §>x

             ####
####################
settled
              x
             ####
####################
stairs
▸ open in playground

A drifting piece descends past four staircase pegs, each just out of its path, so the drift survives every step. Animation only, no output.

source
<§drift=+2 §>X
                #
                       #
                              #
                                     #
##############################################################
settled
                #
                       #
                              #
                     X               #
##############################################################
multidrift
▸ open in playground

Three letters on one row carry scoped drifts of -3, 0, and +3. They fan out as they fall and settle in three columns. Animation only, no output.

source
<§drift=-3 §>{a} <§drift=+0 §>{b} <§drift=+3 §>{c}




##############################################
settled



  a                            b
##############################################  c
rain
▸ open in playground

A row of dots all share a +1 drift and march together as they fall, landing on a diagonal. Animation only, no output.

source
<§drift=+1 §>. . . . . . . . . . . . . . . . . . . . . . . .



##################################################################################
settled


                . . . . . . . . . . . . . . . . . . . . . . . .
##################################################################################

▸ play

Take them further.

The playground loads any of these as a starting point. Edit them, change the walls, add drift, see what falls where.