remove semicolons

This commit is contained in:
me 2025-12-24 09:34:59 +02:00
parent 2b74c4316b
commit 2c31d019d5
6 changed files with 148 additions and 128 deletions

View file

@ -10,16 +10,16 @@ let setup = fn() {
.b: 0, .b: 0,
}, },
.dir: 1, .dir: 1,
}; }
} }
let update = fn(state, input) { let update = fn(state, input) {
let dir = state.dir * speed * get_frame_time(); let dir = state.dir * speed * get_frame_time()
state.color.g = random_u8() % 1; state.color.g = random_u8() % 1
state.color.r = (state.color.r + dir) % max; state.color.r = (state.color.r + dir) % max
if state.color.r < min { if state.color.r < min {
state.color.r = min; state.color.r = min
}; }
state.dir = state.dir =
if state.color.r >= (max - 1) { if state.color.r >= (max - 1) {
-1 -1
@ -29,12 +29,12 @@ let update = fn(state, input) {
} else { } else {
state.dir state.dir
} }
}; }
return state; return state
} }
let draw = fn(state) { let draw = fn(state) {
frame_clear(state.color.r, state.color.g, state.color.b); frame_clear(state.color.r, state.color.g, state.color.b)
} }
let migrate = fn(state) { let migrate = fn(state) {

View file

@ -20,7 +20,7 @@ let setup = fn() {
.speed: 150, .speed: 150,
}, },
}, },
}; }
} }
let migrate = fn(state) { let migrate = fn(state) {
@ -28,61 +28,61 @@ let migrate = fn(state) {
} }
let update = fn(state, input) { let update = fn(state, input) {
let delta = get_frame_time(); let delta = get_frame_time()
let dpad_x = if input.gamepad1.dpad.right { 1 } else { 0 } + if input.gamepad1.dpad.left { -1 } else { 0 }; let dpad_x = if input.gamepad1.dpad.right { 1 } else { 0 } + if input.gamepad1.dpad.left { -1 } else { 0 }
let dpad_y = if input.gamepad1.dpad.down { 1 } else { 0 } + if input.gamepad1.dpad.up { -1 } else { 0 }; let dpad_y = if input.gamepad1.dpad.down { 1 } else { 0 } + if input.gamepad1.dpad.up { -1 } else { 0 }
# let movement = { # let movement = {
# .x: input.gamepad1.sticks.left.x + dpad_x, # .x: input.gamepad1.sticks.left.x + dpad_x,
# .y: input.gamepad1.sticks.left.y + dpad_y, # .y: input.gamepad1.sticks.left.y + dpad_y,
# }; # }
let movement = { let movement = {
.x: dpad_x, .x: dpad_x,
.y: dpad_y, .y: dpad_y,
}; }
state.rect.dimensions.x = state.rect.dimensions.x =
state.rect.dimensions.x + (delta * state.rect.speed * movement.x); state.rect.dimensions.x + (delta * state.rect.speed * movement.x)
state.rect.dimensions.y = state.rect.dimensions.y =
state.rect.dimensions.y + (delta * state.rect.speed * movement.y); state.rect.dimensions.y + (delta * state.rect.speed * movement.y)
let color = { let color = {
.r: state.rect.color.r + (input.gamepad1.sticks.right.x * delta * state.rect.color.speed), .r: state.rect.color.r + (input.gamepad1.sticks.right.x * delta * state.rect.color.speed),
.g: state.rect.color.g + ((0 - input.gamepad1.sticks.right.y) * delta * state.rect.color.speed), .g: state.rect.color.g + ((0 - input.gamepad1.sticks.right.y) * delta * state.rect.color.speed),
.b: state.rect.color.b + ((0 - input.gamepad1.sticks.left.y) * delta * state.rect.color.speed), .b: state.rect.color.b + ((0 - input.gamepad1.sticks.left.y) * delta * state.rect.color.speed),
}; }
state.rect.color.r = if ((0 <= color.r) && (color.r <= 255)) { color.r } else { if color.r < 0 { 0 } else { 255 } }; state.rect.color.r = if ((0 <= color.r) && (color.r <= 255)) { color.r } else { if color.r < 0 { 0 } else { 255 } }
state.rect.color.g = if ((0 <= color.g) && (color.g <= 255)) { color.g } else { if color.g < 0 { 0 } else { 255 } }; state.rect.color.g = if ((0 <= color.g) && (color.g <= 255)) { color.g } else { if color.g < 0 { 0 } else { 255 } }
state.rect.color.b = if ((0 <= color.b) && (color.b <= 255)) { color.b } else { if color.b < 0 { 0 } else { 255 } }; state.rect.color.b = if ((0 <= color.b) && (color.b <= 255)) { color.b } else { if color.b < 0 { 0 } else { 255 } }
return state; return state
} }
let draw = fn(state) { let draw = fn(state) {
frame_clear(state.color.r, state.color.g, state.color.b); frame_clear(state.color.r, state.color.g, state.color.b)
draw_rectangle(state.rect.dimensions, state.rect.color); draw_rectangle(state.rect.dimensions, state.rect.color)
let mut count = 0; let mut count = 0
let r_diff = state.color.r - state.rect.color.r; let r_diff = state.color.r - state.rect.color.r
let g_diff = state.color.g - state.rect.color.g; let g_diff = state.color.g - state.rect.color.g
let b_diff = state.color.b - state.rect.color.b; let b_diff = state.color.b - state.rect.color.b
let epsilon = 2; let epsilon = 2
if ((0 - epsilon) < r_diff) && (r_diff < epsilon) { count = count + 1; }; if ((0 - epsilon) < r_diff) && (r_diff < epsilon) { count = count + 1 }
if ((0 - epsilon) < g_diff) && (g_diff < epsilon) { count = count + 1; }; if ((0 - epsilon) < g_diff) && (g_diff < epsilon) { count = count + 1 }
if ((0 - epsilon) < b_diff) && (b_diff < epsilon) { count = count + 1; }; if ((0 - epsilon) < b_diff) && (b_diff < epsilon) { count = count + 1 }
if count == 0 { if count == 0 {
draw_text("Match the colors", 70, 80, 30, { .r: 255, .g: 255, .b: 255 }); draw_text("Match the colors", 70, 80, 30, { .r: 255, .g: 255, .b: 255 })
}; }
if count == 1 { if count == 1 {
draw_text("Close", 200, 200, 50, { .r: 255, .g: 255, .b: 255 }); draw_text("Close", 200, 200, 50, { .r: 255, .g: 255, .b: 255 })
}; }
if count == 2 { if count == 2 {
draw_text("Closer!!", 200, 200, 50, { .r: 255, .g: 255, .b: 255 }); draw_text("Closer!!", 200, 200, 50, { .r: 255, .g: 255, .b: 255 })
}; }
if count == 3 { if count == 3 {
draw_text("Great Job!", 200, 200, 50, { .r: 255, .g: 255, .b: 255 }); draw_text("Great Job!", 200, 200, 50, { .r: 255, .g: 255, .b: 255 })
}; }
} }

124
game.ayin
View file

@ -46,168 +46,168 @@ let setup = fn() {
}, },
.timer: 0, .timer: 0,
.status: "ongoing", .status: "ongoing",
}; }
} }
let move_player = fn(state, input) { let move_player = fn(state, input) {
let delta = get_frame_time(); let delta = get_frame_time()
let dpad_x = if input.gamepad1.dpad.right { 1 } else { 0 } + if input.gamepad1.dpad.left { -1 } else { 0 }; let dpad_x = if input.gamepad1.dpad.right { 1 } else { 0 } + if input.gamepad1.dpad.left { -1 } else { 0 }
let dpad_y = if input.gamepad1.dpad.down { 1 } else { 0 } + if input.gamepad1.dpad.up { -1 } else { 0 }; let dpad_y = if input.gamepad1.dpad.down { 1 } else { 0 } + if input.gamepad1.dpad.up { -1 } else { 0 }
let movement = { let movement = {
.x: input.gamepad1.sticks.left.x + dpad_x, .x: input.gamepad1.sticks.left.x + dpad_x,
.y: input.gamepad1.sticks.left.y + dpad_y, .y: input.gamepad1.sticks.left.y + dpad_y,
}; }
state.player.pos.x = state.player.pos.x =
max(0, max(0,
min( state.player.pos.x + ((delta * state.player.speed * movement.x) / state.player.shot) min( state.player.pos.x + ((delta * state.player.speed * movement.x) / state.player.shot)
, screen_size - dim.w , screen_size - dim.w
) )
); )
state.player.pos.y = state.player.pos.y =
max(0, max(0,
min( state.player.pos.y + ((delta * state.player.speed * movement.y) / state.player.shot) min( state.player.pos.y + ((delta * state.player.speed * movement.y) / state.player.shot)
, screen_size - dim.w , screen_size - dim.w
) )
); )
} }
let move_opponent = fn(state) { let move_opponent = fn(state) {
let delta = get_frame_time(); let delta = get_frame_time()
let opponent_movement = { let opponent_movement = {
.x: if abs(state.opponent.pos.x - state.player.pos.x) < 5 { 0 } else { if state.opponent.pos.x < state.player.pos.x { 1 } else { -1 } }, .x: if abs(state.opponent.pos.x - state.player.pos.x) < 5 { 0 } else { if state.opponent.pos.x < state.player.pos.x { 1 } else { -1 } },
.y: if abs(state.opponent.pos.y - state.player.pos.y) < 5 { 0 } else { if state.opponent.pos.y < state.player.pos.y { 1 } else { -1 } }, .y: if abs(state.opponent.pos.y - state.player.pos.y) < 5 { 0 } else { if state.opponent.pos.y < state.player.pos.y { 1 } else { -1 } },
}; }
state.opponent.pos.x = state.opponent.pos.x =
max(0, max(0,
min( state.opponent.pos.x + (delta * state.opponent.speed * opponent_movement.x) min( state.opponent.pos.x + (delta * state.opponent.speed * opponent_movement.x)
, screen_size - dim.w , screen_size - dim.w
) )
); )
state.opponent.pos.y = state.opponent.pos.y =
max(0, max(0,
min( state.opponent.pos.y + (delta * state.opponent.speed * opponent_movement.y) min( state.opponent.pos.y + (delta * state.opponent.speed * opponent_movement.y)
, screen_size - dim.w , screen_size - dim.w
) )
); )
shoot_bullets(state, opponent_movement); shoot_bullets(state, opponent_movement)
} }
let shoot_bullets = fn(state, opponent_movement) { let shoot_bullets = fn(state, opponent_movement) {
let delta = get_frame_time(); let delta = get_frame_time()
state.opponent.timer = state.opponent.timer - 1; state.opponent.timer = state.opponent.timer - 1
if (state.opponent.timer <= 0) && (state.status != "caught") { if (state.opponent.timer <= 0) && (state.status != "caught") {
state.opponent.timer = shoot_timer; state.opponent.timer = shoot_timer
state.bullets.pos.x = state.opponent.pos.x + (dim.w * opponent_movement.x); state.bullets.pos.x = state.opponent.pos.x + (dim.w * opponent_movement.x)
state.bullets.pos.y = state.opponent.pos.y + (dim.h * opponent_movement.y); state.bullets.pos.y = state.opponent.pos.y + (dim.h * opponent_movement.y)
state.bullets.movement.x = opponent_movement.x; state.bullets.movement.x = opponent_movement.x
state.bullets.movement.y = opponent_movement.y; state.bullets.movement.y = opponent_movement.y
}; }
} }
let move_bullets = fn(state) { let move_bullets = fn(state) {
let delta = get_frame_time(); let delta = get_frame_time()
state.bullets.pos.x = state.bullets.pos.x =
state.bullets.pos.x + (delta * state.bullets.speed * state.bullets.movement.x); state.bullets.pos.x + (delta * state.bullets.speed * state.bullets.movement.x)
state.bullets.pos.y = state.bullets.pos.y =
state.bullets.pos.y + (delta * state.bullets.speed * state.bullets.movement.y); state.bullets.pos.y + (delta * state.bullets.speed * state.bullets.movement.y)
} }
let update = fn(state, input) { let update = fn(state, input) {
let delta = get_frame_time(); let delta = get_frame_time()
if state.status != "caught" { if state.status != "caught" {
state.timer = state.timer + delta; state.timer = state.timer + delta
}; }
if state.status == "ongoing" { if state.status == "ongoing" {
move_player(state, input); move_player(state, input)
}; }
if state.player.shot_timer > 0 { if state.player.shot_timer > 0 {
state.player.shot_timer = state.player.shot_timer - delta; state.player.shot_timer = state.player.shot_timer - delta
} else { } else {
state.player.shot_timer = 0; state.player.shot_timer = 0
}; }
move_opponent(state); move_opponent(state)
move_bullets(state); move_bullets(state)
if is_touching(make_rect(state.bullets.pos, { .w: dim.w / 2, .h: dim.h / 2 }), make_rect(state.player.pos, dim)) && (state.player.shot_timer == 0) { if is_touching(make_rect(state.bullets.pos, { .w: dim.w / 2, .h: dim.h / 2 }), make_rect(state.player.pos, dim)) && (state.player.shot_timer == 0) {
state.player.shot = state.player.shot + 1; state.player.shot = state.player.shot + 1
state.player.shot_timer = shot_timer; state.player.shot_timer = shot_timer
}; }
if is_touching(make_rect(state.opponent.pos, dim), make_rect(state.player.pos, dim)) { if is_touching(make_rect(state.opponent.pos, dim), make_rect(state.player.pos, dim)) {
state.status = "caught"; state.status = "caught"
}; }
if input.gamepad1.buttons.y { if input.gamepad1.buttons.y {
let new_state = setup(); let new_state = setup()
state.player = new_state.player; state.player = new_state.player
state.opponent = new_state.opponent; state.opponent = new_state.opponent
state.bullets = new_state.bullets; state.bullets = new_state.bullets
state.status = new_state.status; state.status = new_state.status
state.timer = new_state.timer; state.timer = new_state.timer
}; }
return state; state
} }
let draw = fn(state) { let draw = fn(state) {
frame_clear(0, 0, 0); frame_clear(0, 0, 0)
let player_rect = { let player_rect = {
.x: state.player.pos.x, .x: state.player.pos.x,
.y: state.player.pos.y, .y: state.player.pos.y,
.w: dim.w, .w: dim.w,
.h: dim.h, .h: dim.h,
}; }
let color = { .r: 105 + (state.player.shot_timer * 100), .g: 225, .b: 125 }; let color = { .r: 105 + (state.player.shot_timer * 100), .g: 225, .b: 125 }
draw_rectangle(player_rect, color); draw_rectangle(player_rect, color)
let opponent_rect = { let opponent_rect = {
.x: state.opponent.pos.x, .x: state.opponent.pos.x,
.y: state.opponent.pos.y, .y: state.opponent.pos.y,
.w: dim.w, .w: dim.w,
.h: dim.h, .h: dim.h,
}; }
let color = { .r: 255, .g: 155, .b: 255 - (state.player.shot_timer * 50) }; let color = { .r: 255, .g: 155, .b: 255 - (state.player.shot_timer * 50) }
draw_rectangle(opponent_rect, color); draw_rectangle(opponent_rect, color)
let bullet_rect = { let bullet_rect = {
.x: state.bullets.pos.x, .x: state.bullets.pos.x,
.y: state.bullets.pos.y, .y: state.bullets.pos.y,
.w: bullet_dim.w, .w: bullet_dim.w,
.h: bullet_dim.h, .h: bullet_dim.h,
}; }
let color = { .r: 255, .g: 135, .b: 225 }; let color = { .r: 255, .g: 135, .b: 225 }
draw_rectangle(bullet_rect, color); draw_rectangle(bullet_rect, color)
if state.status == "caught" { if state.status == "caught" {
draw_text("You got caught <3", 20, 20, 20, { .r: 155, .g: 55, .b: 255 }); draw_text("You got caught <3", 20, 20, 20, { .r: 155, .g: 55, .b: 255 })
} else { } else {
draw_text("There she is!", 40, 20, 20, { .r: 255, .g: 55, .b: 155 }); draw_text("There she is!", 40, 20, 20, { .r: 255, .g: 55, .b: 155 })
if state.player.shot_timer > 0 { if state.player.shot_timer > 0 {
draw_text("<3", 200, 20, 20, { draw_text("<3", 200, 20, 20, {
.r: 100 + (state.player.shot_timer * 50 * state.player.shot) % 255, .r: 100 + (state.player.shot_timer * 50 * state.player.shot) % 255,
.g: 100, .g: 100,
.b: 100, .b: 100,
}); })
}; }
}; }
draw_text(state.timer, 260, 20, 20, { .r: 55, .g: 205, .b: 155 }); draw_text(state.timer, 260, 20, 20, { .r: 55, .g: 205, .b: 155 })
} }
let min = fn(a,b) { let min = fn(a,b) {

View file

@ -31,8 +31,8 @@ let main = fn() {
fn let_add_3() { fn let_add_3() {
let program = " let program = "
let main = fn() { let main = fn() {
let a = 1; let a = 1
let b = 2; let b = 2
a + b a + b
} }
"; ";
@ -43,8 +43,8 @@ let main = fn() {
fn let_if_4() { fn let_if_4() {
let program = " let program = "
let main = fn() { let main = fn() {
let a = 1; let a = 1
let b = if a > 0 { 3 } else { 5 }; let b = if a > 0 { 3 } else { 5 }
a + b a + b
} }
"; ";
@ -56,12 +56,12 @@ let main = fn() {
fn bor_onearm_4() { fn bor_onearm_4() {
let program = " let program = "
let main = fn() { let main = fn() {
let a = 1; let a = 1
let b = 2 | 3; let b = 2 | 3
if true { if true {
return a + b; return a + b
}; }
return a; return a
} }
"; ";
let result = run_main(program); let result = run_main(program);
@ -72,12 +72,12 @@ let main = fn() {
fn loop_counter_9() { fn loop_counter_9() {
let program = " let program = "
let counter = fn(a,b) { let counter = fn(a,b) {
let mut count = 0; let mut count = 0
loop { loop {
if (a + count) >= b { if (a + count) >= b {
break; break
}; };
count = count + 1; count = count + 1
}; };
count count
} }
@ -95,7 +95,7 @@ let main = fn() {
let program = " let program = "
let main = fn() { let main = fn() {
let state = setup(); let state = setup()
update(state) update(state)
} }
@ -109,7 +109,7 @@ let setup = fn() {
} }
let update = fn(state) { let update = fn(state) {
state.color.b = (state.color.b + state.dir) % 256; state.color.b = (state.color.b + state.dir) % 256
state.dir = state.dir =
if state.color.b == 255 { if state.color.b == 255 {
-1 -1
@ -119,8 +119,8 @@ let update = fn(state) {
} else { } else {
state.dir state.dir
} }
}; }
return state; return state
} }
"; ";
let result = run_main(program); let result = run_main(program);

View file

@ -243,7 +243,7 @@ fn parse_fn(tokens: &mut Tokens) -> ParseResult<ast::Expr> {
} }
fn parse_block(tokens: &mut Tokens) -> ParseResult<Vec<ast::Statement>> { fn parse_block(tokens: &mut Tokens) -> ParseResult<Vec<ast::Statement>> {
if let Some(mut stmts) = tokens.many_sep_by(&Token::Semicolon, parse_statement)? { if let Some(mut stmts) = tokens.many_sep_by_maybe(&Token::Semicolon, parse_statement)? {
//println!("{stmts:#?} {} {:#?}", stmts.len(), tokens.peek()); //println!("{stmts:#?} {} {:#?}", stmts.len(), tokens.peek());
if stmts.len() > 0 && tokens.next_if(&Token::Semicolon).is_some() { if stmts.len() > 0 && tokens.next_if(&Token::Semicolon).is_some() {
stmts.push(ast::Statement::Expr(ast::UNIT)); stmts.push(ast::Statement::Expr(ast::UNIT));
@ -542,13 +542,13 @@ mod tests {
fn let_loop_count() { fn let_loop_count() {
let program = " let program = "
let counter = fn(a,b) { let counter = fn(a,b) {
let mut count = 0; let mut count = 0
loop { loop {
if (a + count) >= b { if (a + count) >= b {
break; break;
}; }
count = count + 1; count = count + 1;
}; }
count count
} }
" "
@ -562,21 +562,21 @@ let counter = fn(a,b) {
let setup = fn() { let setup = fn() {
return { return {
.player: { .position: { .x: 10, .y: 20 }, }, .player: { .position: { .x: 10, .y: 20 }, },
}; }
} }
let update = fn(state, events) { let update = fn(state, events) {
let new = 100; let new = 100
state.player.position.x = new; state.player.position.x = new
return state; return state
} }
let draw = fn(frame, state) { let draw = fn(frame, state) {
frame.clear(0,0,0); frame.clear(0,0,0)
} }
let migrate = fn(state) { let migrate = fn(state) {
return { .player: { .pos: state.player.position } }; return { .player: { .pos: state.player.position } }
} }
" "
.to_string(); .to_string();

View file

@ -153,6 +153,26 @@ impl Tokens {
Ok(None) Ok(None)
} }
} }
pub fn many_sep_by_maybe<T>(
&mut self,
separator: &Token,
parser: Parser<T>,
) -> ParseResult<Vec<T>> {
if let Some(first) = parser(self)? {
let mut results = vec![first];
loop {
self.next_if(&separator);
if let Some(result) = parser(self)? {
results.push(result);
} else {
break;
}
}
Ok(Some(results))
} else {
Ok(Some(vec![]))
}
}
pub fn many_sep_by<T>(&mut self, separator: &Token, parser: Parser<T>) -> ParseResult<Vec<T>> { pub fn many_sep_by<T>(&mut self, separator: &Token, parser: Parser<T>) -> ParseResult<Vec<T>> {
if let Some(first) = parser(self)? { if let Some(first) = parser(self)? {
let mut results = vec![first]; let mut results = vec![first];