mirror of
https://github.com/adambard/learnxinyminutes-docs.git
synced 2025-04-26 15:13:56 +00:00
Delete MontiLang (#5149)
This commit is contained in:
parent
da7182cb2e
commit
39727a7971
@ -1,233 +0,0 @@
|
|||||||
---
|
|
||||||
language: MontiLang
|
|
||||||
filename: montilang.ml
|
|
||||||
contributors:
|
|
||||||
- ["Leo Whitehead", "https://github.com/lduck11007"]
|
|
||||||
---
|
|
||||||
|
|
||||||
MontiLang is a Stack-Oriented concatenative imperative programming language. Its syntax
|
|
||||||
is roughly based off of forth with similar style for doing arithmetic in [reverse polish notation.](https://en.wikipedia.org/wiki/Reverse_Polish_notation)
|
|
||||||
|
|
||||||
A good way to start with MontiLang is to read the documentation and examples at [montilang.ml](http://montilang.ml),
|
|
||||||
then download MontiLang or build from source code with the instructions provided.
|
|
||||||
|
|
||||||
```
|
|
||||||
/# Monti Reference sheet #/
|
|
||||||
/#
|
|
||||||
Comments are multiline
|
|
||||||
Nested comments are not supported
|
|
||||||
#/
|
|
||||||
/# Whitespace is all arbitrary, indentation is optional #/
|
|
||||||
/# All programming in Monti is done by manipulating the parameter stack
|
|
||||||
arithmetic and stack operations in MontiLang are similar to FORTH
|
|
||||||
https://en.wikipedia.org/wiki/Forth_(programming_language)
|
|
||||||
#/
|
|
||||||
|
|
||||||
/# in Monti, everything is either a string or a number. Operations treat all numbers
|
|
||||||
similarly to floats, but anything without a remainder is treated as type int #/
|
|
||||||
|
|
||||||
/# numbers and strings are added to the stack from left to right #/
|
|
||||||
|
|
||||||
/# Arithmetic works by manipulating data on the stack #/
|
|
||||||
|
|
||||||
5 3 + PRINT . /# 8 #/
|
|
||||||
|
|
||||||
/# 5 and 3 are pushed onto the stack
|
|
||||||
'+' replaces top 2 items on stack with sum of top 2 items
|
|
||||||
'PRINT' prints out the top item on the stack
|
|
||||||
'.' pops the top item from the stack.
|
|
||||||
#/
|
|
||||||
|
|
||||||
6 7 * PRINT . /# 42 #/
|
|
||||||
1360 23 - PRINT . /# 1337 #/
|
|
||||||
12 12 / PRINT . /# 1 #/
|
|
||||||
13 2 % PRINT . /# 1 #/
|
|
||||||
|
|
||||||
37 NEG PRINT . /# -37 #/
|
|
||||||
-12 ABS PRINT . /# 12 #/
|
|
||||||
52 23 MAX PRINT . /# 52 #/
|
|
||||||
52 23 MIN PRINT . /# 23 #/
|
|
||||||
|
|
||||||
/# 'PSTACK' command prints the entire stack, 'CLEAR' clears the entire stack #/
|
|
||||||
|
|
||||||
3 6 8 PSTACK CLEAR /# [3, 6, 8] #/
|
|
||||||
|
|
||||||
/# Monti comes with some tools for stack manipulation #/
|
|
||||||
|
|
||||||
2 DUP PSTACK CLEAR /# [2, 2] - Duplicate the top item on the stack#/
|
|
||||||
2 6 SWAP PSTACK CLEAR /# [6, 2] - Swap top 2 items on stack #/
|
|
||||||
1 2 3 ROT PSTACK CLEAR /# [2, 3, 1] - Rotate top 3 items on stack #/
|
|
||||||
2 3 NIP PSTACK CLEAR /# [3] - delete second item from the top of the stack #/
|
|
||||||
4 5 6 TRIM PSTACK CLEAR /# [5, 6] - Deletes first item on stack #/
|
|
||||||
/# variables are assigned with the syntax 'VAR [name]'#/
|
|
||||||
/# When assigned, the variable will take the value of the top item of the stack #/
|
|
||||||
|
|
||||||
6 VAR six . /# assigns var 'six' to be equal to 6 #/
|
|
||||||
3 6 + VAR a . /# assigns var 'a' to be equal to 9 #/
|
|
||||||
|
|
||||||
/# the length of the stack can be calculated with the statement 'STKLEN' #/
|
|
||||||
1 2 3 4 STKLEN PRINT CLEAR /# 4 #/
|
|
||||||
|
|
||||||
/# strings are defined with | | #/
|
|
||||||
|
|
||||||
|Hello World!| VAR world . /# sets variable 'world' equal to string 'Hello world! #/
|
|
||||||
|
|
||||||
/# variables can be called by typing its name. when called, the value of the variable is pushed
|
|
||||||
to the top of the stack #/
|
|
||||||
world PRINT .
|
|
||||||
|
|
||||||
/# with the OUT statement, the top item on the stack can be printed without a newline #/
|
|
||||||
|
|
||||||
|world!| |Hello, | OUT SWAP PRINT CLEAR
|
|
||||||
|
|
||||||
/# Data types can be converted between strings and integers with the commands 'TOINT' and 'TOSTR'#/
|
|
||||||
|5| TOINT PSTACK . /# [5] #/
|
|
||||||
45 TOSTR PSTACK . /# ['45'] #/
|
|
||||||
|
|
||||||
/# User input is taken with INPUT and pushed to the stack. If the top item of the stack is a string,
|
|
||||||
the string is used as an input prompt #/
|
|
||||||
|
|
||||||
|What is your name? | INPUT NIP
|
|
||||||
|Hello, | OUT SWAP PRINT CLEAR
|
|
||||||
|
|
||||||
|
|
||||||
/# FOR loops have the syntax 'FOR [condition] [commands] ENDFOR' At the moment, [condition] can
|
|
||||||
only have the value of an integer. Either by using an integer, or a variable call to an integer.
|
|
||||||
[commands] will be interpreted the amount of time specified in [condition] #/
|
|
||||||
/# E.G: this prints out 1 to 10 #/
|
|
||||||
|
|
||||||
1 VAR a .
|
|
||||||
FOR 10
|
|
||||||
a PRINT 1 + VAR a
|
|
||||||
ENDFOR
|
|
||||||
|
|
||||||
/# the syntax for while loops are similar. A number is evaluated as true if it is larger than
|
|
||||||
0. a string is true if its length > 0. Infinite loops can be used by using literals.
|
|
||||||
#/
|
|
||||||
10 var loop .
|
|
||||||
WHILE loop
|
|
||||||
loop print
|
|
||||||
1 - var loop
|
|
||||||
ENDWHILE
|
|
||||||
/#
|
|
||||||
this loop would count down from 10.
|
|
||||||
|
|
||||||
IF statements are pretty much the same, but only are executed once.
|
|
||||||
#/
|
|
||||||
IF loop
|
|
||||||
loop PRINT .
|
|
||||||
ENDIF
|
|
||||||
|
|
||||||
/# This would only print 'loop' if it is larger than 0 #/
|
|
||||||
|
|
||||||
/# If you would want to use the top item on the stack as loop parameters, this can be done with the ':' character #/
|
|
||||||
|
|
||||||
/# eg, if you wanted to print 'hello' 7 times, instead of using #/
|
|
||||||
|
|
||||||
FOR 7
|
|
||||||
|hello| PRINT .
|
|
||||||
ENDFOR
|
|
||||||
|
|
||||||
/# this could be used #/
|
|
||||||
7
|
|
||||||
FOR :
|
|
||||||
|hello| PRINT .
|
|
||||||
ENDFOR
|
|
||||||
|
|
||||||
/# Equality and inequality statements use the top 2 items on the stack as parameters, and replace the top two items with the output #/
|
|
||||||
/# If it is true, the top 2 items are replaced with '1'. If false, with '0'. #/
|
|
||||||
|
|
||||||
7 3 > PRINT . /# 1 #/
|
|
||||||
2 10 > PRINT . /# 0 #/
|
|
||||||
5 9 <= PRINT . /# 1 #/
|
|
||||||
5 5 == PRINT . /# 1 #/
|
|
||||||
5 7 == PRINT . /# 0 #/
|
|
||||||
3 8 != PRINT . /# 1 #/
|
|
||||||
|
|
||||||
/# User defined commands have the syntax of 'DEF [name] [commands] ENDDEF'. #/
|
|
||||||
/# eg, if you wanted to define a function with the name of 'printseven' to print '7' 10 times, this could be used #/
|
|
||||||
|
|
||||||
DEF printseven
|
|
||||||
FOR 10
|
|
||||||
7 PRINT .
|
|
||||||
ENDFOR
|
|
||||||
ENDDEF
|
|
||||||
|
|
||||||
/# to run the defined statement, simply type it and it will be run by the interpreter #/
|
|
||||||
|
|
||||||
printseven
|
|
||||||
|
|
||||||
/# Montilang supports AND, OR and NOT statements #/
|
|
||||||
|
|
||||||
1 0 AND PRINT . /# 0 #/
|
|
||||||
1 1 AND PRINT . /# 1 #/
|
|
||||||
1 0 OR PRINT . /# 1 #/
|
|
||||||
0 0 OR PRINT . /# 0 #/
|
|
||||||
1 NOT PRINT . /# 0 #/
|
|
||||||
0 NOT PRINT . /# 1 #/
|
|
||||||
|
|
||||||
/# Preprocessor statements are made inbetween '&' characters #/
|
|
||||||
/# currently, preprocessor statements can be used to make c++-style constants #/
|
|
||||||
|
|
||||||
&DEFINE LOOPSTR 20&
|
|
||||||
/# must have & on either side with no spaces, 'DEFINE' is case sensitive. #/
|
|
||||||
/# All statements are scanned and replaced before the program is run, regardless of where the statements are placed #/
|
|
||||||
|
|
||||||
FOR LOOPSTR 7 PRINT . ENDFOR /# Prints '7' 20 times. At run, 'LOOPSTR' in source code is replaced with '20' #/
|
|
||||||
|
|
||||||
/# Multiple files can be used with the &INCLUDE <filename>& Command that operates similar to c++, where the file specified is tokenized,
|
|
||||||
and the &INCLUDE statement is replaced with the file #/
|
|
||||||
|
|
||||||
/# E.G, you can have a program be run through several files. If you had the file 'name.mt' with the following data:
|
|
||||||
|
|
||||||
[name.mt]
|
|
||||||
|Hello, | OUT . name PRINT .
|
|
||||||
|
|
||||||
a program that asks for your name and then prints it out can be defined as such: #/
|
|
||||||
|
|
||||||
|What is your name? | INPUT VAR name . &INCLUDE name.mt&
|
|
||||||
|
|
||||||
/# ARRAYS: #/
|
|
||||||
|
|
||||||
/# arrays are defined with the statement 'ARR'
|
|
||||||
When called, everything currently in the stack is put into one
|
|
||||||
array and all items on the stack are replaced with the new array. #/
|
|
||||||
|
|
||||||
2 3 4 ARR PSTACK . /# [[2, 3, 4]] #/
|
|
||||||
|
|
||||||
/# the statement 'LEN' adds the length of the last item on the stack to the stack.
|
|
||||||
This can be used on arrays, as well as strings. #/
|
|
||||||
|
|
||||||
3 4 5 ARR LEN PRINT . /# 3 #/
|
|
||||||
|
|
||||||
/# values can be appended to an array with the statement 'APPEND' #/
|
|
||||||
|
|
||||||
1 2 3 ARR 5 APPEND . PRINT . /# [1, 2, 3, 5] #/
|
|
||||||
|
|
||||||
/# an array at the top of the stack can be wiped with the statement 'WIPE' #/
|
|
||||||
3 4 5 ARR WIPE PRINT . /# [] #/
|
|
||||||
|
|
||||||
/# The last item of an array can be removed with the statement 'DROP' #/
|
|
||||||
|
|
||||||
3 4 5 ARR DROP PRINT . /# [3, 4]
|
|
||||||
/# arrays, like other datatypes can be stored in variables #/
|
|
||||||
5 6 7 ARR VAR list .
|
|
||||||
list PRINT . /# [5, 6, 7] #/
|
|
||||||
|
|
||||||
/# Values at specific indexes can be changed with the statement 'INSERT <index>' #/
|
|
||||||
4 5 6 ARR
|
|
||||||
97 INSERT 1 . PRINT /# 4, 97, 6 #/
|
|
||||||
|
|
||||||
/# Values at specific indexes can be deleted with the statement 'DEL <index>' #/
|
|
||||||
1 2 3 ARR
|
|
||||||
DEL 1 PRINT . /# [1, 3] #/
|
|
||||||
|
|
||||||
/# items at certain indexes of an array can be gotten with the statement 'GET <index>' #/
|
|
||||||
|
|
||||||
1 2 3 ARR GET 2 PSTACK /# [[1, 2, 3], 3] #/
|
|
||||||
```
|
|
||||||
|
|
||||||
## Extra information
|
|
||||||
|
|
||||||
- [MontiLang.ml](http://montilang.ml/)
|
|
||||||
- [GitHub Page](https://github.com/lduck11007/MontiLang)
|
|
Loading…
Reference in New Issue
Block a user