mirror of
https://github.com/adambard/learnxinyminutes-docs.git
synced 2024-12-23 09:41:36 +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