Package Exports
- strokepm
- strokepm/strokepm.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (strokepm) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
Stroke+-
Stroke+-, also +{/|\}-, is an esoteric structured programming language.
With only four instructions, it aims to be the simplest Turing-complete structured programming language possible.
It uses conditional loops and an unbounded number of non-negative integer variables along with manipulation of their values.
Stroke+- is an extension of Stroke that is even simpler but at the cost of sacrificing Turing completeness.
Language
Stroke+- code consists of stroke symbols /, |, \, and arithmetic signs +, -.
All other symbols are ignored.
Instructions
| Instr | Name | Meaning |
|---|---|---|
+var |
Increment | Increments the value of the variable |
-var |
Decrement | Decrements the value of the variable |
/var |
Loop start | Enters a new loop if the variable is non-zero |
\ |
Loop end | Jumps back to the matching loop start |
The example code in Stroke+-:
+ |
/ |
- |
+ ||
\
+ |||can be translated into the following pseudocode:
inc var0
while var0
dec var0
inc var1
inc var2Optionally, the instruction for output ! may be implemented.
Variables
A Stroke+- program runs on a theoretically infinite tape of non-negative integer cells that are randomly accessible via variables denoted by consecutive vertical stroke symbols (|) in unary form starting from zero. For instance, | refers to the variable indexed by 0, || refers to the variable indexed by 1, ||| refers to the variable indexed by 2, and so on.
Examples
(White spaces are added only for the sake of readability.)
Empty program
The simplest program is the empty program:
Infinite loop
As variable 0 is never reset, the program loops forever:
+ | / | \Move
Moves the value in variable 0 to 1:
MOV 0 1:
/ |
- | dec 0
+ || inc 1
\Copy
Copies the value in variable 0 to 1 using 2 as an auxiliary:
CPY 0 1:
/ |
- | dec 0
+ || inc 1
+ ||| inc 2
\
/ |||
- ||| dec 2
+ | inc 0
\Clear
Sets the value of variable 0 to zero:
CLR 0:
/ |
- |
\Add
Adds the values in 0 and 1 to 0:
ADD 0 1:
/ ||
- ||
+ |
\Conditional branching
Conditional branching (IF) can be simulated via loops:
IF 0:
CPY 0 2 aux 2
/ |||
/ ||| - ||| \ clr aux 2
do something conditionally...
\Fibonacci sequence
Computes the Fibonacci sequence in 0 using 1 and 2 as auxiliaries:
FIB:
+ |||||
/ ||||| forever
MOV 1 2
MOV 0 1
CPY 2 0
ADD 1 2
\Hello World
For computing "Hello World" the numeric values must interpreted as a string. It can achieved by defining a binary alphabet:
| Symbol | Binary |
|---|---|
|
000 |
d |
001 |
e |
010 |
H |
011 |
l |
100 |
o |
101 |
r |
110 |
W |
111 |
The binary number 011010100100101000111101110100001 then corresponds to "Hello World".
To be concise, eight variables can be used and concatenated to represent the output.
They must contain values 00011, 01010, 01001, 01000, 11110, 11101, 00001:
+ | + | + |
+ || + || + || + || + || + || + || + || + || + ||
+ ||| + ||| + ||| + ||| + ||| + ||| + ||| + ||| + |||
+ |||| + |||| + |||| + |||| + |||| + |||| + |||| + ||||
+ ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + ||||| + |||||
+ |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + |||||| + ||||||
+ |||||||Computational class
Stroke+- is Turing complete according to the structured program theorem, as conditional branching (selection) can easily be simulated via loops.
JavaScript interpreter
npm i strokepmconst strokepm = require('strokepm')
strokepm('+|/|-|+||\\+|||') // [0, 1, 1]