feat: more ast elements and some sample syntax
This commit is contained in:
parent
5a9ec708ee
commit
208f2e80ea
|
@ -1,5 +1,47 @@
|
||||||
pub struct Module {}
|
pub struct Module {
|
||||||
|
pub name: Vec<String>,
|
||||||
|
pub docs: Vec<String>,
|
||||||
|
pub is_script: bool,
|
||||||
|
pub is_lib: bool,
|
||||||
|
pub is_policy: bool,
|
||||||
|
}
|
||||||
|
|
||||||
pub enum Decl {}
|
pub enum Definition {
|
||||||
|
Fn {
|
||||||
|
arguments: Vec<String>,
|
||||||
|
body: Expr,
|
||||||
|
doc: Option<String>,
|
||||||
|
name: String,
|
||||||
|
public: bool,
|
||||||
|
return_annotation: Option<()>,
|
||||||
|
return_type: (),
|
||||||
|
},
|
||||||
|
|
||||||
|
TypeAlias {
|
||||||
|
alias: String,
|
||||||
|
annotation: (),
|
||||||
|
doc: Option<String>,
|
||||||
|
parameters: Vec<String>,
|
||||||
|
public: bool,
|
||||||
|
tipo: (),
|
||||||
|
},
|
||||||
|
|
||||||
|
DataType {
|
||||||
|
constructors: Vec<()>,
|
||||||
|
doc: Option<String>,
|
||||||
|
name: String,
|
||||||
|
opaque: bool,
|
||||||
|
parameters: Vec<String>,
|
||||||
|
public: bool,
|
||||||
|
typed_parameters: Vec<()>,
|
||||||
|
},
|
||||||
|
|
||||||
|
Use {
|
||||||
|
module: Vec<String>,
|
||||||
|
as_name: Option<String>,
|
||||||
|
// unqualified: Vec<UnqualifiedImport>,
|
||||||
|
// package: PackageName,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
pub enum Expr {}
|
pub enum Expr {}
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
// imports
|
||||||
|
use std/address.Address as A // alias
|
||||||
|
|
||||||
|
use std/list.{map, foldl} // access module members in one import
|
||||||
|
|
||||||
|
// `///` used for document generation
|
||||||
|
|
||||||
|
// Records (single constructor `data` type)
|
||||||
|
pub type Datum {
|
||||||
|
signer: Address,
|
||||||
|
}
|
||||||
|
|
||||||
|
// above is suger for
|
||||||
|
pub type Datum {
|
||||||
|
Datum { signer: Address },
|
||||||
|
}
|
||||||
|
|
||||||
|
// type aliases
|
||||||
|
type A = Address
|
||||||
|
|
||||||
|
// multiple constructors and a `generic`
|
||||||
|
pub type Redeemer(a) {
|
||||||
|
// records wrapped in parens
|
||||||
|
Buy(Address, a),
|
||||||
|
// records wrapped in curlies
|
||||||
|
Sell { address: Address, some_thing: a },
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn main(datum: Datum, redeemer: Redeemer, ctx: ScriptContext) {
|
||||||
|
[1, 2, 3]
|
||||||
|
|> list.map(fn(x) -> x + 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// named and anonymous functions
|
||||||
|
fn(x) -> x + 1
|
||||||
|
|
||||||
|
fn add_one(x) -> x + 1
|
||||||
|
|
||||||
|
fn(x: Int) -> x + 1
|
||||||
|
|
||||||
|
fn add_one(label x: Int) -> x + 1
|
||||||
|
|
||||||
|
fn(x: Int) {
|
||||||
|
x + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
fn(x: Int) -> Int {
|
||||||
|
x + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add_one(x: Int) -> Int {
|
||||||
|
x + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
// can be curried
|
||||||
|
fn add(a, b) {
|
||||||
|
a + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
let add_one = add(1)
|
||||||
|
|
||||||
|
// matching
|
||||||
|
when redeemer is {
|
||||||
|
Buyer(address, thing) -> do_stuff(),
|
||||||
|
Seller { address, some_thing } -> do_seller_stuff(),
|
||||||
|
}
|
Loading…
Reference in New Issue