Vyxal is the latest addition to the plethora of stack-based languages used for code golfing. But unlike its competitors, Vyxal has a special focus upon readability and elegancy. Indeed, the codepage has been specially chosen to be as mnemonic as possible. Further, constructs from practical languages (such as functions, lambdas and easy list manipulation) are present.
(Vyxal is pronounced Vikesal)
python3 Vyxal.py <file> <flags (single string of flags)> <input(s)>
For a list of command-line flags:
python3 Vyxal.py h
There are 5 data types supported by Vyxal:
- Numbers (integers and reals/floats)
- Strings
- Lists
- Generators
- Functions
+-*/%
perform addition, subtraction, multiplication, division and modulo respectively.,
prints the top of the stack:_
duplicates the top of the stack and pops the top of the stack respectively!
pushes the length of the stack
[truthy_branch|falsey_branch]
[truthy_branch]
The if statement pops the top of the stack, and if it is truthy, executes the truthy branch. Otherwise, if a falsey branch is present, it will branch to execute that.
(variable|body)
(body)
The for loop pops the top of the stack and iterates through each item. If the value popped is an integer, it loops through the range [0, n)
. If variable
is present, the iteration value is stored in that. Otherwise, the iteration value is stored in the context variable n
.
{condition|body}
{body}
The while loop repeats body
until condition
evaluates as true. If there is no explicit condition, 1
is used as the condition, meaning that {...}
is an infinite loop.
@name|code;
@name:number_of_arguments|code;
@name:variable|code;
@name:argument_list|code;
@name;
If code
isn't present, the function with name name
is called. Otherwise, the function is defined. The arguments can be a combination of variables and numbers. Numbers tell the function how many items to pop from the main stack as arguments, and variables store a single value in the variable. Numbered arguments are pushed to the function's stack -- functions operate on their own scoped stack with scoped variables (much like Python).
For example:
@triple:1|3*;
Takes 1 parameter and pushes it to the function's stack
@triple:value|←value 3*;
Takes a single argument and stores it in variable value
.
@add_and_halve:1:rhs|←rhs +2/;
Takes two arguments: pushes the first on to the stack and stores the second in variable rhs
@average:*|W:L$∑$/;
Takes however many arguments as defined by the first value popped from the stack. A function call of 2 3 3 3 @average;
would take three arguments.
λarity|code;
λcode;
Where the @...;
function stores the definition for infinite re-use, the lambda pushes a reference to the code inside it. This is similar to python's lambdas, which are temporary functions, or literal functions (for lack of better word).
These can be applied using †
. For example: 3 λ3*; †
will result in 9
. Lambdas are also useful for mapping/filtering/reducing a vector according to the lambda's code.
- At the end of program execution (eof), if nothing has been printed (using
,
or other printing commands), the top value on the stack is automatically printed. - If there isn't enough values on the stack to perform an operation, implicit input is taken. If input is passed through command line arguments, then the input used is cycled.
- Input can be either through arguments or STDIN. STDIN is used if arguments aren't avaliable. If no input is avaliable at all, 0 is returned.
- In functions (and lambdas), if implicit input is needed, the argument(s) passed are used as the input "list".
Vyxal has so many commands that it is impractical to list them all here. Here is the reference page (markdown).
`Hello, World!`
`ƈṡ, ƛ€!
The above program uses dictionary compression: words in a predefined list are indexed using a subjective base-162 literal.
kH
₁ƛ₍₃₅kF½*∑⟇
æ
KL2=
- @Razetime for helping me with the online interpreter's design
- @ysthakur for making the reference.md file and making an automated process to do so.
- code-golf se user @2x-1 for helping me establish the fundamentals of Vyxal and being my first collaborator on this journey.
- @8dion8 for language suggestions and motivation in the MAWP discord group.
- @Amiller42 for pointing out bugs and fixing bugfixes