added exmaple program
This commit is contained in:
51
README.md
51
README.md
@@ -1,3 +1,52 @@
|
||||
# fudge2
|
||||
|
||||
second iteration of the fudge language
|
||||
second iteration of the fudge language
|
||||
|
||||
## example program
|
||||
```asm
|
||||
|
||||
// Map, Filter, Reduce
|
||||
sig map := (T => U) => #iterable(T) => #iterable(U)
|
||||
let map f ls := match ls | (x:xs) => (f x: map f xs)
|
||||
| [] => []
|
||||
|
||||
// Side Effects are ugly, C-FFI
|
||||
sig polluting map := #polluting (Maybe T => U) => Iterable(T) => Nothing
|
||||
let polluting map f [ls] :=
|
||||
using std/c-ffi/guarantee_no_parallel_map as seqmap
|
||||
{
|
||||
seqmap 0 (len ls) (i => f (ls at i))
|
||||
}
|
||||
|
||||
// type traits
|
||||
sig polluting print := #repr T => Result (Nothing, #error io_error)
|
||||
let polluting print s := using std/io/write, std/io/stdout {
|
||||
write stdout (Repr s)
|
||||
}
|
||||
|
||||
// Overloading?
|
||||
sig polluting print := Iterable (#repr T) => Result (Nothing, #error io_error)
|
||||
let polluting print #repr ls := using std\io as io {
|
||||
map print ls
|
||||
}
|
||||
|
||||
// Generic types
|
||||
sig add := T => T => T
|
||||
let add a b := a + b
|
||||
|
||||
// Partial application
|
||||
sig inc := T => T
|
||||
let inc a = add a 1
|
||||
|
||||
// Evaluate a polluting expression
|
||||
sig polluting do := #polluting T => Nothing
|
||||
|
||||
@data := struct (
|
||||
let arr := Array(0..100) :> inc,
|
||||
let ls := List(0..100) :> (x=>x*x),
|
||||
let all := arr ++ ls,
|
||||
)
|
||||
@main := do print @data/all;
|
||||
]
|
||||
|
||||
```
|
||||
@@ -1,5 +1,7 @@
|
||||
pub mod literal_parsers;
|
||||
use std::fmt::{Debug, Display};
|
||||
|
||||
pub mod errors;
|
||||
pub mod literal_parsers;
|
||||
|
||||
#[derive(Debug, Clone, PartialEq)]
|
||||
pub struct Program {
|
||||
@@ -14,6 +16,16 @@ pub enum Literal {
|
||||
Bool(bool),
|
||||
}
|
||||
|
||||
impl Display for Literal {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
match self {
|
||||
Literal::Int(i) => write!(f, "i64({})", i),
|
||||
Literal::Float(fl) => write!(f, "f64({})", fl),
|
||||
Literal::Bool(b) => write!(f, "bool({})", b),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq)]
|
||||
pub enum Expression {
|
||||
Lit(Literal),
|
||||
@@ -23,14 +35,13 @@ pub enum Expression {
|
||||
Mul(Box<Expression>, Box<Expression>),
|
||||
Div(Box<Expression>, Box<Expression>),
|
||||
Mod(Box<Expression>, Box<Expression>),
|
||||
FuncCall(String, Vec<Expression>),
|
||||
}
|
||||
|
||||
|
||||
#[derive(Debug, Clone, PartialEq)]
|
||||
pub enum Definition {
|
||||
Binding {
|
||||
name: String,
|
||||
value: Expression,
|
||||
},
|
||||
Binding { name: String, value: Expression },
|
||||
StructDef(StructDefinition),
|
||||
EnumDef(EnumDefinition),
|
||||
}
|
||||
@@ -75,7 +86,7 @@ pub struct EnumDefinition {
|
||||
|
||||
#[derive(Debug, Clone, PartialEq)]
|
||||
pub struct EnumdefLiteral {
|
||||
pub body: Vec<OptionallyTypedIdentifier>
|
||||
pub body: Vec<OptionallyTypedIdentifier>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq)]
|
||||
|
||||
@@ -30,4 +30,5 @@ let "let"
|
||||
:= "assign"
|
||||
Type "type"
|
||||
\@main "main"
|
||||
[\n;] "linedelim"
|
||||
[\n;]+ "linedelim"
|
||||
[\n]+ "newline"
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#![allow(dead_code, unused)]
|
||||
use crate::errors::CLIArgumentError;
|
||||
use lrlex::lrlex_mod;
|
||||
use lrpar::lrpar_mod;
|
||||
|
||||
Reference in New Issue
Block a user