Wise
Paradigm(s) | procedural, imperative |
---|---|
Designed by | User:DivergentClouds |
Appeared in | 2023 |
Memory system | stack-based |
Dimensions | one-dimensional |
Computational class | Unknown |
Reference implementation | Zig |
File extension(s) | .wise , .wis |
Wise is a stack-based language based on an extension of bitwise operations for bases ≥ 2.
Overview
There are 3 main registers (A
, B
,C
) and 2 stacks (X
, Y
). In addition there is the base
register, which notates the current base. All numbers are unbounded non-negative integers. A digit of A
is notated as a
and B
as b
.
A
, B
and C
are all initialized to 0, and base
is initialized to 2.
Operators
The digit-wise operators operate on each of the least-significant C
digits of A
and B
(or just A
in the case of ~
). Any remaining digits of A
are preserved in the result. The result is then pushed to X
.
Command | Description |
---|---|
~ |
(base - 1) - a
|
| |
min(a + b, (base - 1))
|
^ |
(a + b) mod base
|
& |
min(a × b, (base - 1))
|
* |
(a × b) mod base
|
The shift operators operate on all of A
and B
. They can be thought of as shifting all digits of A
by B
. The result is then pushed to X
.
Command | Description |
---|---|
< |
A × pow(base, B)
|
> |
floor(A ÷ pow(base, B))
|
The digit count operator returns the number of digits in A
, not including leading zeroes. The result is then pushed to X
.
Command | Description |
---|---|
/ |
if (A == 0): 0, else: log_base(A) + 1
|
The final math operator is the base operator, which is used to set base
. Attempting to set base
to a value < 2 is an error.
Command | Description |
---|---|
_ |
A → base
|
The cycling operators are used to change register and stack references.
Command | Description |
---|---|
$ |
Swap the stacks; X becomes Y , and Y becomes X
|
% |
Cycle the main registers; A becomes B , B becomes C , and C becomes A
|
The stack operators all modify X
. Popping from an empty stack is an error.
Command | Description |
---|---|
@ |
Push A , does not modify A
|
! |
Pop into A
|
0 |
Push 0
|
1 |
Push 1
|
The branching operators are used for conditional execution. The program is treated as an implicit block. If C
is 0, then A
and B
are treated as 0.
Command | Description |
---|---|
? |
If a ≤ b for the first C digits, go to the end of the innermost block
|
" |
If a > b for the first C digits, go to the start of the innermost block
|
( |
Start a block, must have a matching )
|
) |
End a block, must have a matching (
|
The I/O operators treat numbers outside the program as base-10.
Command | Description |
---|---|
i |
Get a base-10 number as input and push it to the stack, converting to the current base. Waits for input |
o |
Output A, converting from the current base to base-10 |
Comments last until the end of line.
Command | Description |
---|---|
# |
Start a comment which lasts until the end of the line |