@ -> ^, functional example
This commit is contained in:
14
README.md
14
README.md
@@ -28,6 +28,20 @@ func main[] : i64
|
|||||||
io.println("Too high!")
|
io.println("Too high!")
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```rust
|
||||||
|
func square[x: i64] : i64
|
||||||
|
return x * x
|
||||||
|
|
||||||
|
func sum[a: i64, b: i64] : i64
|
||||||
|
return a + b
|
||||||
|
|
||||||
|
func main[] : i64
|
||||||
|
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
|
||||||
|
|> alg.map(^square)
|
||||||
|
|> alg.reduce(^sum, 0)
|
||||||
|
|> io.println_i64()
|
||||||
|
```
|
||||||
|
|
||||||
## Quickstart
|
## Quickstart
|
||||||
```
|
```
|
||||||
cargo install --git https://github.com/antpiasecki/zern
|
cargo install --git https://github.com/antpiasecki/zern
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ func main[] : i64
|
|||||||
io.println("FizzBuzz")
|
io.println("FizzBuzz")
|
||||||
else if i % 5 == 0
|
else if i % 5 == 0
|
||||||
io.println("Buzz")
|
io.println("Buzz")
|
||||||
else if i %3 == 0
|
else if i % 3 == 0
|
||||||
io.println("Fizz")
|
io.println("Fizz")
|
||||||
else
|
else
|
||||||
io.println_i64(i)
|
io.println_i64(i)
|
||||||
11
examples/functional.zr
Normal file
11
examples/functional.zr
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
func square[x: i64] : i64
|
||||||
|
return x * x
|
||||||
|
|
||||||
|
func sum[a: i64, b: i64] : i64
|
||||||
|
return a + b
|
||||||
|
|
||||||
|
func main[] : i64
|
||||||
|
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
|
||||||
|
|> alg.map(^square)
|
||||||
|
|> alg.reduce(^sum, 0)
|
||||||
|
|> io.println_i64()
|
||||||
@@ -15,7 +15,7 @@ func main[] : i64
|
|||||||
let db = 0
|
let db = 0
|
||||||
let stmt = 0
|
let stmt = 0
|
||||||
|
|
||||||
rc = sqlite3_open("todo.db", @db)
|
rc = sqlite3_open("todo.db", ^db)
|
||||||
if rc
|
if rc
|
||||||
dbg.panic("failed to open db")
|
dbg.panic("failed to open db")
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@ func main[] : i64
|
|||||||
break
|
break
|
||||||
else if choice == 1
|
else if choice == 1
|
||||||
io.println("============")
|
io.println("============")
|
||||||
sqlite3_prepare_v2(db, "SELECT * FROM todo", -1, @stmt, 0)
|
sqlite3_prepare_v2(db, "SELECT * FROM todo", -1, ^stmt, 0)
|
||||||
|
|
||||||
while sqlite3_step(stmt) == 100
|
while sqlite3_step(stmt) == 100
|
||||||
let id: i64 = sqlite3_column_int(stmt, 0)
|
let id: i64 = sqlite3_column_int(stmt, 0)
|
||||||
@@ -51,7 +51,7 @@ func main[] : i64
|
|||||||
io.print("\nEnter new task: ")
|
io.print("\nEnter new task: ")
|
||||||
let task: str = io.read_line() |> str.trim()
|
let task: str = io.read_line() |> str.trim()
|
||||||
|
|
||||||
sqlite3_prepare_v2(db, "INSERT INTO todo(task) VALUES (?);", -1, @stmt, 0)
|
sqlite3_prepare_v2(db, "INSERT INTO todo(task) VALUES (?);", -1, ^stmt, 0)
|
||||||
sqlite3_bind_text(stmt, 1, task, -1, 0)
|
sqlite3_bind_text(stmt, 1, task, -1, 0)
|
||||||
if sqlite3_step(stmt) != 101
|
if sqlite3_step(stmt) != 101
|
||||||
dbg.panic(sqlite3_errmsg(db))
|
dbg.panic(sqlite3_errmsg(db))
|
||||||
@@ -61,7 +61,7 @@ func main[] : i64
|
|||||||
io.print("\nEnter task id: ")
|
io.print("\nEnter task id: ")
|
||||||
let id: i64 = io.read_line() |> str.parse_i64()
|
let id: i64 = io.read_line() |> str.parse_i64()
|
||||||
|
|
||||||
sqlite3_prepare_v2(db, "DELETE FROM todo WHERE id = ?;", -1, @stmt, 0)
|
sqlite3_prepare_v2(db, "DELETE FROM todo WHERE id = ?;", -1, ^stmt, 0)
|
||||||
sqlite3_bind_int(stmt, 1, id, -1, 0)
|
sqlite3_bind_int(stmt, 1, id, -1, 0)
|
||||||
if sqlite3_step(stmt) != 101
|
if sqlite3_step(stmt) != 101
|
||||||
dbg.panic(sqlite3_errmsg(db))
|
dbg.panic(sqlite3_errmsg(db))
|
||||||
|
|||||||
@@ -151,8 +151,6 @@ func scan_token[tokens: array, current: ptr, line: ptr, column: ptr, source: str
|
|||||||
add_token("Xor", tokens, source, start, mem.read64(current), mem.read64(line), mem.read64(column))
|
add_token("Xor", tokens, source, start, mem.read64(current), mem.read64(line), mem.read64(column))
|
||||||
else if c == ':'
|
else if c == ':'
|
||||||
add_token("Colon", tokens, source, start, mem.read64(current), mem.read64(line), mem.read64(column))
|
add_token("Colon", tokens, source, start, mem.read64(current), mem.read64(line), mem.read64(column))
|
||||||
else if c == '@'
|
|
||||||
add_token("At", tokens, source, start, mem.read64(current), mem.read64(line), mem.read64(column))
|
|
||||||
else if c == '.'
|
else if c == '.'
|
||||||
if match_char('.', current, column, source, source_len)
|
if match_char('.', current, column, source, source_len)
|
||||||
add_token("DoubleDot", tokens, source, start, mem.read64(current), mem.read64(line), mem.read64(column))
|
add_token("DoubleDot", tokens, source, start, mem.read64(current), mem.read64(line), mem.read64(column))
|
||||||
@@ -241,7 +239,7 @@ func tokenize[source: str, filename: str] : array
|
|||||||
let tokens: array = []
|
let tokens: array = []
|
||||||
|
|
||||||
while !eof(current, source_len)
|
while !eof(current, source_len)
|
||||||
scan_token(tokens, @current, @line, @column, source, source_len, filename, indent_stack, @current_indent)
|
scan_token(tokens, ^current, ^line, ^column, source, source_len, filename, indent_stack, ^current_indent)
|
||||||
|
|
||||||
add_token_with_lexeme("Eof", tokens, "", line, column)
|
add_token_with_lexeme("Eof", tokens, "", line, column)
|
||||||
return tokens
|
return tokens
|
||||||
|
|||||||
@@ -441,7 +441,7 @@ impl Parser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn unary(&mut self) -> Result<Expr, ZernError> {
|
fn unary(&mut self) -> Result<Expr, ZernError> {
|
||||||
if self.match_token(&[TokenType::At]) {
|
if self.match_token(&[TokenType::Xor]) {
|
||||||
let op = self.previous().clone();
|
let op = self.previous().clone();
|
||||||
let right = self.unary()?;
|
let right = self.unary()?;
|
||||||
return Ok(Expr::AddrOf {
|
return Ok(Expr::AddrOf {
|
||||||
|
|||||||
36
src/std.zr
36
src/std.zr
@@ -47,7 +47,7 @@ func io.println[x: str] : void
|
|||||||
io.print("\n")
|
io.print("\n")
|
||||||
|
|
||||||
func io.print_char[x: u8] : void
|
func io.print_char[x: u8] : void
|
||||||
io.print_sized(@x, 1)
|
io.print_sized(^x, 1)
|
||||||
|
|
||||||
func io.print_i64[x: i64] : void
|
func io.print_i64[x: i64] : void
|
||||||
let s: str = str.from_i64(x)
|
let s: str = str.from_i64(x)
|
||||||
@@ -61,7 +61,7 @@ func io.println_i64[x: i64] : void
|
|||||||
|
|
||||||
func io.read_char[] : u8
|
func io.read_char[] : u8
|
||||||
let c: u8 = 0
|
let c: u8 = 0
|
||||||
_builtin_syscall(0, 0, @c, 1) // read
|
_builtin_syscall(0, 0, ^c, 1) // read
|
||||||
return c
|
return c
|
||||||
|
|
||||||
func io.read_line[]: str
|
func io.read_line[]: str
|
||||||
@@ -341,6 +341,14 @@ func math.abs[n: i64] : i64
|
|||||||
return -n
|
return -n
|
||||||
return n
|
return n
|
||||||
|
|
||||||
|
func math.sign[n: i64] : i64
|
||||||
|
if n < 0
|
||||||
|
return -1
|
||||||
|
else if n > 0
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
|
||||||
func math.pow[b: i64, e: i64] : i64
|
func math.pow[b: i64, e: i64] : i64
|
||||||
let out = 1
|
let out = 1
|
||||||
for i in 0..e
|
for i in 0..e
|
||||||
@@ -480,13 +488,31 @@ func alg.count[arr: array, item: i64] : i64
|
|||||||
count = count + 1
|
count = count + 1
|
||||||
return count
|
return count
|
||||||
|
|
||||||
|
func alg.map[arr: array, fn: ptr] : array
|
||||||
|
let out: array = []
|
||||||
|
for i in 0..array.size(arr)
|
||||||
|
array.push(out, fn(array.nth(arr, i)))
|
||||||
|
return out
|
||||||
|
|
||||||
|
func alg.filter[arr: array, fn: ptr] : array
|
||||||
|
let out: array = []
|
||||||
|
for i in 0..array.size(arr)
|
||||||
|
if fn(array.nth(arr, i))
|
||||||
|
array.push(out, array.nth(arr, i))
|
||||||
|
return out
|
||||||
|
|
||||||
|
func alg.reduce[arr: array, fn: ptr, acc: i64] : i64
|
||||||
|
for i in 0..array.size(arr)
|
||||||
|
acc = fn(acc, array.nth(arr, i))
|
||||||
|
return acc
|
||||||
|
|
||||||
func os.exit[code: i64] : void
|
func os.exit[code: i64] : void
|
||||||
_builtin_syscall(60, code)
|
_builtin_syscall(60, code)
|
||||||
|
|
||||||
func os.urandom[]: i64
|
func os.urandom[]: i64
|
||||||
let n = 0
|
let n = 0
|
||||||
let fd: i64 = _builtin_syscall(257, -100, "/dev/urandom", 0, 0) // openat
|
let fd: i64 = _builtin_syscall(257, -100, "/dev/urandom", 0, 0) // openat
|
||||||
_builtin_syscall(0, fd, @n, 8) // read
|
_builtin_syscall(0, fd, ^n, 8) // read
|
||||||
_builtin_syscall(3, fd) // close
|
_builtin_syscall(3, fd) // close
|
||||||
return n
|
return n
|
||||||
|
|
||||||
@@ -508,7 +534,7 @@ func os.shell[command: str] : i64
|
|||||||
_builtin_syscall(60, 1) // exit
|
_builtin_syscall(60, 1) // exit
|
||||||
else
|
else
|
||||||
let status = 0
|
let status = 0
|
||||||
let wp: i64 = _builtin_syscall(61, pid, @status, 0, 0) // waitpid
|
let wp: i64 = _builtin_syscall(61, pid, ^status, 0, 0) // waitpid
|
||||||
if wp == -1
|
if wp == -1
|
||||||
return -1
|
return -1
|
||||||
let st: i64 = status & 0xffffffff
|
let st: i64 = status & 0xffffffff
|
||||||
@@ -557,7 +583,7 @@ func net.listen[packed_host: i64, port: i64] : i64
|
|||||||
return -1
|
return -1
|
||||||
|
|
||||||
let optval = 1
|
let optval = 1
|
||||||
if _builtin_syscall(54, s, 1, 2, @optval, 8) < 0 // setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
|
if _builtin_syscall(54, s, 1, 2, ^optval, 8) < 0 // setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
|
||||||
_builtin_syscall(3, s) // close
|
_builtin_syscall(3, s) // close
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ pub enum TokenType {
|
|||||||
LogicalAnd,
|
LogicalAnd,
|
||||||
LogicalOr,
|
LogicalOr,
|
||||||
Pipe,
|
Pipe,
|
||||||
At,
|
|
||||||
DoubleDot,
|
DoubleDot,
|
||||||
ShiftLeft,
|
ShiftLeft,
|
||||||
ShiftRight,
|
ShiftRight,
|
||||||
@@ -158,7 +157,6 @@ impl Tokenizer {
|
|||||||
'%' => self.add_token(TokenType::Mod),
|
'%' => self.add_token(TokenType::Mod),
|
||||||
'^' => self.add_token(TokenType::Xor),
|
'^' => self.add_token(TokenType::Xor),
|
||||||
':' => self.add_token(TokenType::Colon),
|
':' => self.add_token(TokenType::Colon),
|
||||||
'@' => self.add_token(TokenType::At),
|
|
||||||
'.' => {
|
'.' => {
|
||||||
if self.match_char('.') {
|
if self.match_char('.') {
|
||||||
self.add_token(TokenType::DoubleDot)
|
self.add_token(TokenType::DoubleDot)
|
||||||
|
|||||||
Reference in New Issue
Block a user