mirror of
https://github.com/Dummi26/mers.git
synced 2025-03-10 14:13:52 +01:00
update site
This commit is contained in:
parent
f8e23d0ce8
commit
5a8edd9605
44
index.html
44
index.html
@ -6,19 +6,43 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>Mers</h1>
|
<h1>Mers</h1>
|
||||||
<section>
|
<section class="container">
|
||||||
<div class="container_left textalign-center">
|
<section class="container_left2 code-border">
|
||||||
mers gud?<br>
|
<pre><code class="mers-code-snippet">
|
||||||
Second line.<br>
|
fn get_number_input(question string) {<br> println(question)<br> input = read_line()<br> // try to parse to an int, then a float.<br> in = match input {<br> input.parse_int() input<br> input.parse_float() input<br> }<br> // 'in' has type int/float/[] because of the match statement<br> switch! in {<br> int/float in<br> // replace [] with an appropriate error before returning<br> [] Err: "input was not a number."<br> }<br> // return type is int/float/Err(string)<br>}<br><br>answer = get_number_input("What is your favorite number?")<br><br>// switch can be used to branch based on a variables type.<br>// switch! indicates that every possible type must be handled.<br>switch! answer {<br> int {<br> println("Entered an integer")<br> answer.debug() // int<br> }<br> float {<br> println("Entered a decimal number")<br> answer.debug() // float<br> }<br> Err(string) println("Input was not a number!")<br>}<br><br>sleep(2)<br><br><br>// function that returns an anonymous function (function object).<br>// anonymous functions can be used as iterators in for-loops.<br>fn count_up() {<br> count = -1<br> () {<br> count = count.add(1)<br> count<br> }<br>}<br><br>for num count_up() {<br> println(num.to_string())<br> // once num is greater than 60,<br> // the loop stops and returns num.<br> if num.gt(60) num else []<br>}<br><br></code></pre>
|
||||||
(yes this is a prototype)
|
|
||||||
</div>
|
|
||||||
<section class="container_center code-border">
|
|
||||||
<code class="mers-code-snippet">
|
|
||||||
#!/usr/bin/env mers<br>/* welcome to mers */<br>println("Hello, World!")<br>42 // return value<br><br></code>
|
|
||||||
</section>
|
</section>
|
||||||
<section class="container_right">
|
<section class="container_right">
|
||||||
<image src="data:image/jpg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAP//////////////////////////////////////////////////////////////////////////////////////2wBDAf//////////////////////////////////////////////////////////////////////////////////////wAARCAGCAcQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAECA//EACIQAQEAAgICAwEBAQEAAAAAAAABAhESMUFRIWFxgTLRIv/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/8QAFhEBAQEAAAAAAAAAAAAAAAAAABFB/9oADAMBAAIRAxEAPwDQACgAAAAAKAAAIoCCoAAAAAAAioAAAAAACYeW2MPLYAAAAAAAAAAAAAAAAAAAAAAAAAAMgAoAAACooAICbWXbDWINAAAAIoCAAAAAAIoCBakoKDNoLh5bYw8tgAAAAAAAAAAAAAAAAAAAAAAAAAAyCgAAAoAACKwCXSy6RFR03By26Y1FaAAAARUABAUEBWLV2yAgA3OmasqA1h1W2MOq2Dje6F7pJsAa4nEGRricQZCzSAogCiAKIAogCiAKIAoig7AAAAyqKAAAqKAACXphuufQKyuyfKomlx+KfiyIroz5Wsg2ImwL2qeUBpIJsGmL2WpsBAAAAABvDptjDpsHG91cUvdXEHRm5KxQXksu3NqA1YxXRigyKaBAABdGgQU0CC6NUEF0AiooOwAAAMgbBRNqCeVZ8tUE2bRIDW0olvwCImwGo1GcemgavTMNoCoAKixARFQAAAAAEBRAHTDptjDpsHG91cUvdXEG2K6M3EGGpF4nQK51bUBqLUi0GKFAbiZLEyBmOmmI2B0biWsA6M2LKUHNQB2AAABkFBBQEFAZ+DUaAZ0lnw2lnwDkDWINaNNAM6qarYDGqfLYDHyny6AOaOqQHMdNRNQGBvXyagMDWouoDmN6iaBrDptjDpsHG91cUvdXEHRi1pigsrVc43AYqOljANRakWgxQpAbiZLEyBI2xG/AMVlqsg3GqzGqDnQoDsAAADKooAAAKCCoAXqiZX4oOSy6J2tx9A6S7VxlsrcyBsZ2bBTcZAa3E3E0mga3DbGjQNbNs/J8gogCgnyCoANYdNs4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">
|
<image
|
||||||
|
alt="some picture related to mers (todo)"
|
||||||
|
src="data:image/jpg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAP//////////////////////////////////////////////////////////////////////////////////////2wBDAf//////////////////////////////////////////////////////////////////////////////////////wAARCAGCAcQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAECA//EACIQAQEAAgICAwEBAQEAAAAAAAABAhESMUFRIWFxgTLRIv/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/8QAFhEBAQEAAAAAAAAAAAAAAAAAABFB/9oADAMBAAIRAxEAPwDQACgAAAAAKAAAIoCCoAAAAAAAioAAAAAACYeW2MPLYAAAAAAAAAAAAAAAAAAAAAAAAAAMgAoAAACooAICbWXbDWINAAAAIoCAAAAAAIoCBakoKDNoLh5bYw8tgAAAAAAAAAAAAAAAAAAAAAAAAAAyCgAAAoAACKwCXSy6RFR03By26Y1FaAAAARUABAUEBWLV2yAgA3OmasqA1h1W2MOq2Dje6F7pJsAa4nEGRricQZCzSAogCiAKIAogCiAKIAoig7AAAAyqKAAAqKAACXphuufQKyuyfKomlx+KfiyIroz5Wsg2ImwL2qeUBpIJsGmL2WpsBAAAAABvDptjDpsHG91cUvdXEHRm5KxQXksu3NqA1YxXRigyKaBAABdGgQU0CC6NUEF0AiooOwAAAMgbBRNqCeVZ8tUE2bRIDW0olvwCImwGo1GcemgavTMNoCoAKixARFQAAAAAEBRAHTDptjDpsHG91cUvdXEG2K6M3EGGpF4nQK51bUBqLUi0GKFAbiZLEyBmOmmI2B0biWsA6M2LKUHNQB2AAABkFBBQEFAZ+DUaAZ0lnw2lnwDkDWINaNNAM6qarYDGqfLYDHyny6AOaOqQHMdNRNQGBvXyagMDWouoDmN6iaBrDptjDpsHG91cUvdXEHRi1pigsrVc43AYqOljANRakWgxQpAbiZLEyBI2xG/AMVlqsg3GqzGqDnQoDsAAADKooAAAKCCoAXqiZX4oOSy6J2tx9A6S7VxlsrcyBsZ2bBTcZAa3E3E0mga3DbGjQNbNs/J8gogCgnyCoANYdNs4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"
|
||||||
|
width="100%" height="100%"
|
||||||
|
>
|
||||||
|
<h3>Mers types</h3>
|
||||||
|
<div>
|
||||||
|
Mers uses a multiple-types system.
|
||||||
|
It keeps track of which types a variable could have
|
||||||
|
and constructs a type with that information.
|
||||||
|
<br>
|
||||||
|
For example, <code>int/float</code> can represent a number - int or float.
|
||||||
|
Optional types can be <code>[]/[t]</code> - either nothing or one value (tuple with length 0 or 1).
|
||||||
|
Mers doesn't have null, it just has the empty tuple <code>[]</code>.
|
||||||
|
</div>
|
||||||
|
<h3>No exceptions, no crashes</h3>
|
||||||
|
<div>
|
||||||
|
Errors in mers are passed as values.
|
||||||
|
Because of the type system, you are forced to handle them explicitly.
|
||||||
|
Mers will not crash in unexpected places, because the only way to crash
|
||||||
|
it is by using one of the assume*() functions (similar to unwrap()s).
|
||||||
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
<hr>
|
||||||
|
<h3>HTML preprocessor to help build this document written in mers:</h3>
|
||||||
|
<section class="container">
|
||||||
|
<pre class="container2_left"><code>
|
||||||
|
<!DOCTYPE html><br># This document will be processed by build.mers.<br># Lines starting with hashtags are comments and will be ignored.<br># Lines starting with dollar-signs insert special text.<br># To escape this, put a space before the hashtag or dollar sign.<br><head><br> <meta charset=“UTF-8”><br> <link rel="stylesheet" href="site/external.css"><br> <title>Mark :: mers</title><br></head><br><body><br> <h1>Mers</h1><br> <section class="container"><br> <section class="container_left2 code-border"><br> <pre><code class="mers-code-snippet"><br>$welcome_script<br> </code></pre><br> </section><br> <section class="container_right"><br> <image<br> alt="some picture related to mers (todo)"<br> src="data:image/jpg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAP//////<br> width="100%" height="100%"<br> ><br> <h3>Mers types</h3><br> <div><br> Mers uses a multiple-types system.<br> It keeps track of which types a variable could have<br> and constructs a type with that information.<br> <br><br> For example, <code>int/float</code> can represent a number - int or<br> Optional types can be <code>[]/[t]</code> - either nothing or one v<br> Mers doesn't have null, it just has the empty tuple <code>[]</code><br> </div><br> <h3>No exceptions, no crashes</h3><br> <div><br> Errors in mers are passed as values.<br> Because of the type system, you are forced to handle them explicitl<br> Mers will not crash in unexpected places, because the only way to c<br> it is by using one of the assume*() functions (similar to unwrap()s<br> </div><br> </section><br> </section><br> <hr><br> <h3>HTML preprocessor to help build this document written in mers:</h3><br> <section class="container"><br> <pre class="container2_left"><code><br>$index.html<br> </code></pre><br> <pre class="container2_right"><code class="mers-code-snippet"><br>$build_script<br> </code></pre><br> </section><br></body><br><br></code></pre>
|
||||||
|
<pre class="container2_right"><code class="mers-code-snippet">
|
||||||
|
#!/usr/bin/env mers<br><br>// helper functions<br><br>fn read_string(path string) {<br> bytes_to_string(fs_read(path).assume_no_enum()).assume_no_enum()<br>}<br>fn code_to_html(code string code_width_limit_chars int) {<br> out = ""<br> for line code.regex(".*").assume_no_enum() {<br> if code_width_limit_chars.gtoe(0).and(line.len().gt(code_width_limit_chars)) {<br> line = line.substring(0 code_width_limit_chars)<br> }<br> line = line<br> .replace("&" "&amp;")<br> .replace("<" "&lt;")<br> .replace(">" "&gt;")<br> out = out.add(line.add("<br>"))<br> }<br> out<br>}<br><br>// data<br><br>index = read_string("index.html")<br><br>index_html = index.code_to_html(75)<br>build_script = read_string("build.mers").code_to_html(-1)<br>welcome_script = read_string("welcome.mers").code_to_html(-1)<br><br>// process index.html<br><br>out = ""<br>for line index.regex("\\S*.*").assume_no_enum() {<br> if line.starts_with("#") {<br> // comment, ignore<br> } else if line.starts_with("$") {<br> if line.eq("$welcome_script") {<br> out = out.add(welcome_script)<br> } else if line.eq("$build_script") {<br> out = out.add(build_script)<br> } else if line.eq("$index.html") {<br> out = out.add(index_html)<br> }<br> } else {<br> // remove spaces<br> loop {<br> if line.starts_with(" ") {<br> line = line.substring(1)<br> } else {<br> true // break<br> }<br> }<br> out = out.add(line.add("\n"))<br> }<br>}<br><br>fs_write("../index.html" string_to_bytes(out)).assume_no_enum()<br><br></code></pre>
|
||||||
|
</section>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
@ -84,6 +84,7 @@ pub enum BuiltinFunction {
|
|||||||
IndexOf,
|
IndexOf,
|
||||||
Trim,
|
Trim,
|
||||||
Substring,
|
Substring,
|
||||||
|
Replace,
|
||||||
Regex,
|
Regex,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,6 +145,7 @@ impl BuiltinFunction {
|
|||||||
"index_of" => Self::IndexOf,
|
"index_of" => Self::IndexOf,
|
||||||
"trim" => Self::Trim,
|
"trim" => Self::Trim,
|
||||||
"substring" => Self::Substring,
|
"substring" => Self::Substring,
|
||||||
|
"replace" => Self::Replace,
|
||||||
"regex" => Self::Regex,
|
"regex" => Self::Regex,
|
||||||
_ => return None,
|
_ => return None,
|
||||||
})
|
})
|
||||||
@ -484,6 +486,12 @@ impl BuiltinFunction {
|
|||||||
.is_empty()
|
.is_empty()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
Self::Replace => {
|
||||||
|
input.len() == 3
|
||||||
|
&& input
|
||||||
|
.iter()
|
||||||
|
.all(|v| v.fits_in(&VSingleType::String.to(), info).is_empty())
|
||||||
|
}
|
||||||
Self::Trim => {
|
Self::Trim => {
|
||||||
input.len() == 1 && input[0].fits_in(&VSingleType::String.to(), info).is_empty()
|
input.len() == 1 && input[0].fits_in(&VSingleType::String.to(), info).is_empty()
|
||||||
}
|
}
|
||||||
@ -707,6 +715,7 @@ impl BuiltinFunction {
|
|||||||
},
|
},
|
||||||
Self::Trim => VSingleType::String.into(),
|
Self::Trim => VSingleType::String.into(),
|
||||||
Self::Substring => VSingleType::String.into(),
|
Self::Substring => VSingleType::String.into(),
|
||||||
|
Self::Replace => VSingleType::String.to(),
|
||||||
Self::Regex => VType {
|
Self::Regex => VType {
|
||||||
types: vec![
|
types: vec![
|
||||||
// [string ...]
|
// [string ...]
|
||||||
@ -1703,6 +1712,17 @@ impl BuiltinFunction {
|
|||||||
unreachable!()
|
unreachable!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Self::Replace => {
|
||||||
|
if let (VDataEnum::String(a), VDataEnum::String(b), VDataEnum::String(c)) = (
|
||||||
|
args[0].run(vars, info).data,
|
||||||
|
args[1].run(vars, info).data,
|
||||||
|
args[2].run(vars, info).data,
|
||||||
|
) {
|
||||||
|
VDataEnum::String(a.replace(&b, &c)).to()
|
||||||
|
} else {
|
||||||
|
unreachable!()
|
||||||
|
}
|
||||||
|
}
|
||||||
Self::Regex => {
|
Self::Regex => {
|
||||||
if args.len() == 2 {
|
if args.len() == 2 {
|
||||||
if let (VDataEnum::String(a), VDataEnum::String(regex)) =
|
if let (VDataEnum::String(a), VDataEnum::String(regex)) =
|
||||||
|
@ -1,26 +1,34 @@
|
|||||||
#!/usr/bin/env mers
|
#!/usr/bin/env mers
|
||||||
|
|
||||||
|
// helper functions
|
||||||
|
|
||||||
fn read_string(path string) {
|
fn read_string(path string) {
|
||||||
bytes_to_string(fs_read(path).assume_no_enum()).assume_no_enum()
|
bytes_to_string(fs_read(path).assume_no_enum()).assume_no_enum()
|
||||||
}
|
}
|
||||||
|
fn code_to_html(code string code_width_limit_chars int) {
|
||||||
|
out = ""
|
||||||
|
for line code.regex(".*").assume_no_enum() {
|
||||||
|
if code_width_limit_chars.gtoe(0).and(line.len().gt(code_width_limit_chars)) {
|
||||||
|
line = line.substring(0 code_width_limit_chars)
|
||||||
|
}
|
||||||
|
line = line
|
||||||
|
.replace("&" "&")
|
||||||
|
.replace("<" "<")
|
||||||
|
.replace(">" ">")
|
||||||
|
out = out.add(line.add("<br>"))
|
||||||
|
}
|
||||||
|
out
|
||||||
|
}
|
||||||
|
|
||||||
|
// data
|
||||||
|
|
||||||
index = read_string("index.html")
|
index = read_string("index.html")
|
||||||
|
|
||||||
welcome_script: []/string = []
|
index_html = index.code_to_html(75)
|
||||||
get_welcome_script = () {
|
build_script = read_string("build.mers").code_to_html(-1)
|
||||||
script = welcome_script
|
welcome_script = read_string("welcome.mers").code_to_html(-1)
|
||||||
switch! script {
|
|
||||||
string script
|
// process index.html
|
||||||
[] {
|
|
||||||
scr = ""
|
|
||||||
for line read_string("welcome.mers").regex(".*").assume_no_enum() {
|
|
||||||
scr = scr.add(line.add("<br>"))
|
|
||||||
}
|
|
||||||
welcome_script = scr
|
|
||||||
scr
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
out = ""
|
out = ""
|
||||||
for line index.regex("\\S*.*").assume_no_enum() {
|
for line index.regex("\\S*.*").assume_no_enum() {
|
||||||
@ -28,10 +36,14 @@ for line index.regex("\\S*.*").assume_no_enum() {
|
|||||||
// comment, ignore
|
// comment, ignore
|
||||||
} else if line.starts_with("$") {
|
} else if line.starts_with("$") {
|
||||||
if line.eq("$welcome_script") {
|
if line.eq("$welcome_script") {
|
||||||
script = get_welcome_script.run()
|
out = out.add(welcome_script)
|
||||||
out = out.add(script)
|
} else if line.eq("$build_script") {
|
||||||
|
out = out.add(build_script)
|
||||||
|
} else if line.eq("$index.html") {
|
||||||
|
out = out.add(index_html)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// remove spaces
|
||||||
loop {
|
loop {
|
||||||
if line.starts_with(" ") {
|
if line.starts_with(" ") {
|
||||||
line = line.substring(1)
|
line = line.substring(1)
|
||||||
|
@ -3,14 +3,26 @@ body {
|
|||||||
background-color: DarkSlateBlue;
|
background-color: DarkSlateBlue;
|
||||||
/* background-color: MidnightBlue; */
|
/* background-color: MidnightBlue; */
|
||||||
}
|
}
|
||||||
h1 {
|
h1, h2, h3 {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
hr {
|
||||||
|
display: block;
|
||||||
|
height: 1px;
|
||||||
|
border: 0;
|
||||||
|
border-top: 1px solid #ccc;
|
||||||
|
margin: 1em 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.mers-code-snippet {
|
.mers-code-snippet {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
height: auto;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
.container_left {
|
.container_left {
|
||||||
margin-left: 9%;
|
margin-left: 9%;
|
||||||
width: 20%;
|
width: 20%;
|
||||||
@ -25,6 +37,13 @@ h1 {
|
|||||||
border-style: dotted;
|
border-style: dotted;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
.container_left2 {
|
||||||
|
margin-left: 9%;
|
||||||
|
width: 50%;
|
||||||
|
margin-right: 5%;
|
||||||
|
float: left;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
.container_right {
|
.container_right {
|
||||||
margin-left: 5%;
|
margin-left: 5%;
|
||||||
width: 20%;
|
width: 20%;
|
||||||
@ -32,9 +51,29 @@ h1 {
|
|||||||
float: right;
|
float: right;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
.container2_left {
|
||||||
|
margin-left: 9%;
|
||||||
|
width: 40%;
|
||||||
|
float: left;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.container2_right {
|
||||||
|
margin-right: 9%;
|
||||||
|
width: 40%;
|
||||||
|
float: right;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
.code-border {
|
.code-border {
|
||||||
border-style: double;
|
border-style: double;
|
||||||
}
|
}
|
||||||
.textalign-center {
|
.textalign-center {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
.afterpagebreak {
|
||||||
|
width: 100%;
|
||||||
|
page-break-before: always;
|
||||||
|
}
|
||||||
|
.fullwide {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
@ -10,19 +10,45 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>Mers</h1>
|
<h1>Mers</h1>
|
||||||
<section>
|
<section class="container">
|
||||||
<div class="container_left textalign-center">
|
<section class="container_left2 code-border">
|
||||||
mers gud?<br>
|
<pre><code class="mers-code-snippet">
|
||||||
Second line.<br>
|
|
||||||
(yes this is a prototype)
|
|
||||||
</div>
|
|
||||||
<section class="container_center code-border">
|
|
||||||
<code class="mers-code-snippet">
|
|
||||||
$welcome_script
|
$welcome_script
|
||||||
</code>
|
</code></pre>
|
||||||
</section>
|
</section>
|
||||||
<section class="container_right">
|
<section class="container_right">
|
||||||
<image src="data:image/jpg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAP//////////////////////////////////////////////////////////////////////////////////////2wBDAf//////////////////////////////////////////////////////////////////////////////////////wAARCAGCAcQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAECA//EACIQAQEAAgICAwEBAQEAAAAAAAABAhESMUFRIWFxgTLRIv/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/8QAFhEBAQEAAAAAAAAAAAAAAAAAABFB/9oADAMBAAIRAxEAPwDQACgAAAAAKAAAIoCCoAAAAAAAioAAAAAACYeW2MPLYAAAAAAAAAAAAAAAAAAAAAAAAAAMgAoAAACooAICbWXbDWINAAAAIoCAAAAAAIoCBakoKDNoLh5bYw8tgAAAAAAAAAAAAAAAAAAAAAAAAAAyCgAAAoAACKwCXSy6RFR03By26Y1FaAAAARUABAUEBWLV2yAgA3OmasqA1h1W2MOq2Dje6F7pJsAa4nEGRricQZCzSAogCiAKIAogCiAKIAoig7AAAAyqKAAAqKAACXphuufQKyuyfKomlx+KfiyIroz5Wsg2ImwL2qeUBpIJsGmL2WpsBAAAAABvDptjDpsHG91cUvdXEHRm5KxQXksu3NqA1YxXRigyKaBAABdGgQU0CC6NUEF0AiooOwAAAMgbBRNqCeVZ8tUE2bRIDW0olvwCImwGo1GcemgavTMNoCoAKixARFQAAAAAEBRAHTDptjDpsHG91cUvdXEG2K6M3EGGpF4nQK51bUBqLUi0GKFAbiZLEyBmOmmI2B0biWsA6M2LKUHNQB2AAABkFBBQEFAZ+DUaAZ0lnw2lnwDkDWINaNNAM6qarYDGqfLYDHyny6AOaOqQHMdNRNQGBvXyagMDWouoDmN6iaBrDptjDpsHG91cUvdXEHRi1pigsrVc43AYqOljANRakWgxQpAbiZLEyBI2xG/AMVlqsg3GqzGqDnQoDsAAADKooAAAKCCoAXqiZX4oOSy6J2tx9A6S7VxlsrcyBsZ2bBTcZAa3E3E0mga3DbGjQNbNs/J8gogCgnyCoANYdNs4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">
|
<image
|
||||||
|
alt="some picture related to mers (todo)"
|
||||||
|
src="data:image/jpg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAP//////////////////////////////////////////////////////////////////////////////////////2wBDAf//////////////////////////////////////////////////////////////////////////////////////wAARCAGCAcQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAECA//EACIQAQEAAgICAwEBAQEAAAAAAAABAhESMUFRIWFxgTLRIv/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/8QAFhEBAQEAAAAAAAAAAAAAAAAAABFB/9oADAMBAAIRAxEAPwDQACgAAAAAKAAAIoCCoAAAAAAAioAAAAAACYeW2MPLYAAAAAAAAAAAAAAAAAAAAAAAAAAMgAoAAACooAICbWXbDWINAAAAIoCAAAAAAIoCBakoKDNoLh5bYw8tgAAAAAAAAAAAAAAAAAAAAAAAAAAyCgAAAoAACKwCXSy6RFR03By26Y1FaAAAARUABAUEBWLV2yAgA3OmasqA1h1W2MOq2Dje6F7pJsAa4nEGRricQZCzSAogCiAKIAogCiAKIAoig7AAAAyqKAAAqKAACXphuufQKyuyfKomlx+KfiyIroz5Wsg2ImwL2qeUBpIJsGmL2WpsBAAAAABvDptjDpsHG91cUvdXEHRm5KxQXksu3NqA1YxXRigyKaBAABdGgQU0CC6NUEF0AiooOwAAAMgbBRNqCeVZ8tUE2bRIDW0olvwCImwGo1GcemgavTMNoCoAKixARFQAAAAAEBRAHTDptjDpsHG91cUvdXEG2K6M3EGGpF4nQK51bUBqLUi0GKFAbiZLEyBmOmmI2B0biWsA6M2LKUHNQB2AAABkFBBQEFAZ+DUaAZ0lnw2lnwDkDWINaNNAM6qarYDGqfLYDHyny6AOaOqQHMdNRNQGBvXyagMDWouoDmN6iaBrDptjDpsHG91cUvdXEHRi1pigsrVc43AYqOljANRakWgxQpAbiZLEyBI2xG/AMVlqsg3GqzGqDnQoDsAAADKooAAAKCCoAXqiZX4oOSy6J2tx9A6S7VxlsrcyBsZ2bBTcZAa3E3E0mga3DbGjQNbNs/J8gogCgnyCoANYdNs4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"
|
||||||
|
width="100%" height="100%"
|
||||||
|
>
|
||||||
|
<h3>Mers types</h3>
|
||||||
|
<div>
|
||||||
|
Mers uses a multiple-types system.
|
||||||
|
It keeps track of which types a variable could have
|
||||||
|
and constructs a type with that information.
|
||||||
|
<br>
|
||||||
|
For example, <code>int/float</code> can represent a number - int or float.
|
||||||
|
Optional types can be <code>[]/[t]</code> - either nothing or one value (tuple with length 0 or 1).
|
||||||
|
Mers doesn't have null, it just has the empty tuple <code>[]</code>.
|
||||||
|
</div>
|
||||||
|
<h3>No exceptions, no crashes</h3>
|
||||||
|
<div>
|
||||||
|
Errors in mers are passed as values.
|
||||||
|
Because of the type system, you are forced to handle them explicitly.
|
||||||
|
Mers will not crash in unexpected places, because the only way to crash
|
||||||
|
it is by using one of the assume*() functions (similar to unwrap()s).
|
||||||
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
<hr>
|
||||||
|
<h3>HTML preprocessor to help build this document written in mers:</h3>
|
||||||
|
<section class="container">
|
||||||
|
<pre class="container2_left"><code>
|
||||||
|
$index.html
|
||||||
|
</code></pre>
|
||||||
|
<pre class="container2_right"><code class="mers-code-snippet">
|
||||||
|
$build_script
|
||||||
|
</code></pre>
|
||||||
|
</section>
|
||||||
</body>
|
</body>
|
||||||
|
56
site/welcome.mers
Normal file → Executable file
56
site/welcome.mers
Normal file → Executable file
@ -1,4 +1,52 @@
|
|||||||
#!/usr/bin/env mers
|
fn get_number_input(question string) {
|
||||||
/* welcome to mers */
|
println(question)
|
||||||
println("Hello, World!")
|
input = read_line()
|
||||||
42 // return value
|
// try to parse to an int, then a float.
|
||||||
|
in = match input {
|
||||||
|
input.parse_int() input
|
||||||
|
input.parse_float() input
|
||||||
|
}
|
||||||
|
// 'in' has type int/float/[] because of the match statement
|
||||||
|
switch! in {
|
||||||
|
int/float in
|
||||||
|
// replace [] with an appropriate error before returning
|
||||||
|
[] Err: "input was not a number."
|
||||||
|
}
|
||||||
|
// return type is int/float/Err(string)
|
||||||
|
}
|
||||||
|
|
||||||
|
answer = get_number_input("What is your favorite number?")
|
||||||
|
|
||||||
|
// switch can be used to branch based on a variables type.
|
||||||
|
// switch! indicates that every possible type must be handled.
|
||||||
|
switch! answer {
|
||||||
|
int {
|
||||||
|
println("Entered an integer")
|
||||||
|
answer.debug() // int
|
||||||
|
}
|
||||||
|
float {
|
||||||
|
println("Entered a decimal number")
|
||||||
|
answer.debug() // float
|
||||||
|
}
|
||||||
|
Err(string) println("Input was not a number!")
|
||||||
|
}
|
||||||
|
|
||||||
|
sleep(2)
|
||||||
|
|
||||||
|
|
||||||
|
// function that returns an anonymous function (function object).
|
||||||
|
// anonymous functions can be used as iterators in for-loops.
|
||||||
|
fn count_up() {
|
||||||
|
count = -1
|
||||||
|
() {
|
||||||
|
count = count.add(1)
|
||||||
|
count
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for num count_up() {
|
||||||
|
println(num.to_string())
|
||||||
|
// once num is greater than 60,
|
||||||
|
// the loop stops and returns num.
|
||||||
|
if num.gt(60) num else []
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user