replace def = value with def: value, and let a = b with a = b

in the name of terseness

i'm also slipping in a new brush preset that i made

closes #125
This commit is contained in:
りき萌 2025-06-30 23:54:50 +02:00
parent 8fcf71661e
commit 9de4a8aecd
5 changed files with 67 additions and 45 deletions

View file

@ -635,7 +635,7 @@ fn def_prepass<'a>(c: &mut Compiler<'a>, src: &Source<'a>, toplevel: NodeId) ->
while let Some(binary) = walk.node_of(NodeKind::Binary) { while let Some(binary) = walk.node_of(NodeKind::Binary) {
let mut binary_walk = src.ast.walk(binary); let mut binary_walk = src.ast.walk(binary);
if let (Some(ident), Some(op)) = (binary_walk.node(), binary_walk.get(NodeKind::Op)) { if let (Some(ident), Some(op)) = (binary_walk.node(), binary_walk.get(NodeKind::Op)) {
if src.ast.span(op).slice(src.code) == "=" { if src.ast.span(op).slice(src.code) == ":" {
let name = src.ast.span(ident).slice(src.code); let name = src.ast.span(ident).slice(src.code);
match c.defs.add_def(name) { match c.defs.add_def(name) {
Ok(_) => (), Ok(_) => (),
@ -667,7 +667,7 @@ fn compile_toplevel_expr<'a>(
) -> CompileResult<ToplevelExpr> { ) -> CompileResult<ToplevelExpr> {
if src.ast.kind(node_id) == NodeKind::Binary { if src.ast.kind(node_id) == NodeKind::Binary {
if let Some(op) = src.ast.walk(node_id).get(NodeKind::Op) { if let Some(op) = src.ast.walk(node_id).get(NodeKind::Op) {
if src.ast.span(op).slice(src.code) == "=" { if src.ast.span(op).slice(src.code) == ":" {
compile_def(c, src, node_id)?; compile_def(c, src, node_id)?;
return Ok(ToplevelExpr::Def); return Ok(ToplevelExpr::Def);
} }

View file

@ -73,7 +73,6 @@ fn ident(l: &mut Lexer<'_>) -> TokenKind {
"or" => TokenKind::Or, "or" => TokenKind::Or,
"if" => TokenKind::If, "if" => TokenKind::If,
"else" => TokenKind::Else, "else" => TokenKind::Else,
"let" => TokenKind::Let,
_ => TokenKind::Ident, _ => TokenKind::Ident,
} }
} }
@ -210,6 +209,7 @@ fn token(l: &mut Lexer<'_>) -> (TokenKind, Span) {
'[' => one(l, TokenKind::LBrack), '[' => one(l, TokenKind::LBrack),
']' => one(l, TokenKind::RBrack), ']' => one(l, TokenKind::RBrack),
',' => one(l, TokenKind::Comma), ',' => one(l, TokenKind::Comma),
':' => one(l, TokenKind::Colon),
'\\' => one(l, TokenKind::Backslash), '\\' => one(l, TokenKind::Backslash),
_ => { _ => {

View file

@ -306,7 +306,7 @@ enum Tighter {
fn tighter(left: TokenKind, right: TokenKind) -> Tighter { fn tighter(left: TokenKind, right: TokenKind) -> Tighter {
fn tightness(kind: TokenKind) -> Option<usize> { fn tightness(kind: TokenKind) -> Option<usize> {
match kind { match kind {
TokenKind::Equal => Some(0), TokenKind::Equal | TokenKind::Colon => Some(0),
TokenKind::EqualEqual TokenKind::EqualEqual
| TokenKind::NotEqual | TokenKind::NotEqual
| TokenKind::Less | TokenKind::Less
@ -590,7 +590,6 @@ const PREFIX_TOKENS: TokenKindSet = TokenKindSet::new(&[
TokenKind::LParen, TokenKind::LParen,
TokenKind::Backslash, TokenKind::Backslash,
TokenKind::If, TokenKind::If,
TokenKind::Let,
TokenKind::LBrack, TokenKind::LBrack,
]); ]);
@ -606,7 +605,6 @@ fn prefix(p: &mut Parser) -> Closed {
TokenKind::LParen => paren(p), TokenKind::LParen => paren(p),
TokenKind::Backslash => lambda(p), TokenKind::Backslash => lambda(p),
TokenKind::If => if_expr(p), TokenKind::If => if_expr(p),
TokenKind::Let => let_expr(p),
_ => { _ => {
assert!( assert!(
@ -637,7 +635,9 @@ fn infix(p: &mut Parser, op: TokenKind) -> NodeKind {
| TokenKind::LessEqual | TokenKind::LessEqual
| TokenKind::Greater | TokenKind::Greater
| TokenKind::GreaterEqual | TokenKind::GreaterEqual
| TokenKind::Equal => infix_binary(p, op), | TokenKind::Colon => infix_binary(p, op),
TokenKind::Equal => infix_let(p, op),
_ if PREFIX_TOKENS.contains(op) => infix_call(p), _ if PREFIX_TOKENS.contains(op) => infix_call(p),
@ -666,6 +666,31 @@ fn infix_call(p: &mut Parser) -> NodeKind {
NodeKind::Call NodeKind::Call
} }
fn infix_let(p: &mut Parser, op: TokenKind) -> NodeKind {
p.advance();
if p.peek() == TokenKind::Newline {
p.advance();
}
precedence_parse(p, op);
if p.peek() == TokenKind::Newline {
p.advance();
} else {
let span = p.span();
p.emit(Diagnostic::error(
span,
"new line expected after variable definition `a = b`",
));
p.advance_with_error();
}
expr(p);
NodeKind::Let
}
pub fn expr(p: &mut Parser) { pub fn expr(p: &mut Parser) {
precedence_parse(p, TokenKind::Eof) precedence_parse(p, TokenKind::Eof)
} }

View file

@ -316,7 +316,7 @@ Binary @ 0..6
); );
assert_ast_eq( assert_ast_eq(
"1 = 1", "1 : 1",
expr, expr,
" "
Binary @ 0..5 Binary @ 0..5
@ -864,52 +864,49 @@ Toplevel @ 1..63
#[test] #[test]
fn let_expr() { fn let_expr() {
assert_ast_eq( assert_ast_eq(
r#" let x = 1 r#" x = 1
x "#, x "#,
toplevel, toplevel,
" "
Toplevel @ 1..24 Toplevel @ 1..20
Let @ 1..24 Let @ 1..20
Token @ 1..4 Ident @ 1..2
Ident @ 5..6 Token @ 1..2
Token @ 3..4
Number @ 5..6
Token @ 5..6 Token @ 5..6
Token @ 7..8 Token @ 6..7
Number @ 9..10 Ident @ 19..20
Token @ 9..10 Token @ 19..20",
Token @ 10..11
Ident @ 23..24
Token @ 23..24",
); );
assert_ast_eq( assert_ast_eq(
r#" let x = 1 r#" x = 1
let y = 2 y = 2
x + y "#, x + y "#,
toplevel, toplevel,
" "
Toplevel @ 1..50 Toplevel @ 1..42
Let @ 1..50 Let @ 1..42
Token @ 1..4 Ident @ 1..2
Ident @ 5..6 Token @ 1..2
Token @ 3..4
Number @ 5..6
Token @ 5..6 Token @ 5..6
Token @ 7..8 Token @ 6..7
Number @ 9..10 Let @ 19..42
Token @ 9..10 Ident @ 19..20
Token @ 10..11 Token @ 19..20
Let @ 23..50 Token @ 21..22
Token @ 23..26 Number @ 23..24
Ident @ 27..28 Token @ 23..24
Token @ 27..28 Token @ 24..25
Token @ 29..30 Binary @ 37..42
Number @ 31..32 Ident @ 37..38
Token @ 31..32 Token @ 37..38
Token @ 32..33 Op @ 39..40
Binary @ 45..50 Token @ 39..40
Ident @ 45..46 Ident @ 41..42
Token @ 45..46 Token @ 41..42",
Op @ 47..48
Token @ 47..48
Ident @ 49..50
Token @ 49..50",
) )
} }

View file

@ -34,6 +34,7 @@ pub enum TokenKind {
RBrack, RBrack,
Comma, Comma,
Equal, Equal,
Colon,
Backslash, Backslash,
RArrow, RArrow,
@ -43,7 +44,6 @@ pub enum TokenKind {
Or, Or,
If, If,
Else, Else,
Let,
// NOTE: This must be kept last for TokenSet to work correctly. // NOTE: This must be kept last for TokenSet to work correctly.
Error, Error,