Pyramid Scheme

From Esolang
Jump to navigation Jump to search
For the mostly-unrelated dialect of Scheme which targets EVM, see the external article "Write your next Ethereum Contract in Pyramid Scheme".
Pyramid Scheme
Paradigm(s) declarative
Designed by Conor O'Brien
Appeared in 2017
Computational class Turing complete
Reference implementation [1]
Influenced by Lisp
File extension(s) .pyr, .pyra

Pyramid Scheme is an esoteric programming language created by Conor O'Brien in early 2017. It is a dialect of Lisp, but it uses ascii-art pyramid structures as opposed to brackets.

Etymology

The name is a joke on the name of a different Lisp dialect called Scheme, and its similarity to a (widely frowned-upon and illegal) business model called the pyramid scheme.

Sample programs

If/Else statement

The following is an implementation of an if-else statement in pyramid scheme. It prints if A is 1 for truthy, and 0 if it is falsey

    ^          ^
   / \        / \
  /set\      /   \
 ^-----^    /  ?  \
/A\   /1\  ^-------^
---   --- /!\     / \
         ^---    /out\
        / \     ^-----
       / ? \   /0\
      ^-----^  ---
     /A\   / \
     ---  /out\
         ^-----
        /1\
        ---

This is equivalent to the lisp-like syntax:

(set A 1)
(? (! (? A (out 1))) (out 0))

Modulo function

Pyramid scheme does not have an implementation of the modulo function. A modulo of a number has to, therefore, be calculated with repeated subtraction. The following implements the mod(a,b) function:

    ^         ^            ^      ^
   / \       / \          / \    / \
  /set\     /set\        /   \  /out\
 ^-----^   ^-----^      /     \ -----^
/a\   / \ /b\   / \    /       \    /a\
---  /33 \---  /16 \  /  loop   \   ---
     -----     ----- ^-----------^
                    / \         / \
                   /   \       /set\
                  / <=> \     ^-----^
                 ^-------^   /a\   /-\
                / \     / \  ---  ^---^
               /<=>\   /-1 \     /a\ /b\
              ^-----^  -----     --- ---
             /a\   /b\
             ---   ---

which is equivalent to lisp-like:

(set a 33)
(set b 16)
(loop (<=> (<=> a b) -1) (set a (- a b)))
(out a)

External resources