diff options
| author | Laurenz <laurmaedje@gmail.com> | 2023-02-02 14:13:56 +0100 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2023-02-02 14:13:56 +0100 |
| commit | 5f5c65927982447133b625edea3f5c9bab4f9e3d (patch) | |
| tree | aa5edb320e21466d16a1d15ad320d164f94738db /src | |
| parent | 21dd99926a24d7cc69bf6b032d1107c78a04a5cf (diff) | |
Math tests
Diffstat (limited to 'src')
| -rw-r--r-- | src/model/eval.rs | 34 | ||||
| -rw-r--r-- | src/syntax/ast.rs | 7 | ||||
| -rw-r--r-- | src/syntax/lexer.rs | 8 |
3 files changed, 24 insertions, 25 deletions
diff --git a/src/model/eval.rs b/src/model/eval.rs index 6e03d440..1fbf4125 100644 --- a/src/model/eval.rs +++ b/src/model/eval.rs @@ -919,32 +919,26 @@ impl Eval for ast::FuncCall { // field access and does not evaluate to a module. let (callee, mut args) = if let ast::Expr::FieldAccess(access) = callee { let target = access.target(); - let method = access.field(); - let method_span = method.span(); - let method = method.take(); - let point = || Tracepoint::Call(Some(method.clone())); - if methods::is_mutating(&method) { + let field = access.field(); + let field_span = field.span(); + let field = field.take(); + let point = || Tracepoint::Call(Some(field.clone())); + if methods::is_mutating(&field) { let args = args.eval(vm)?; - let value = target.access(vm)?; - - let value = if let Value::Module(module) = &value { - module.get(&method).cloned().at(method_span)? - } else { - return methods::call_mut(value, &method, args, span) + let target = target.access(vm)?; + if !matches!(target, Value::Symbol(_) | Value::Module(_)) { + return methods::call_mut(target, &field, args, span) .trace(vm.world, point, span); - }; - - (value, args) + } + (target.field(&field).at(field_span)?, args) } else { let target = target.eval(vm)?; let args = args.eval(vm)?; - let value = if let Value::Module(module) = &target { - module.get(&method).cloned().at(method_span)? - } else { - return methods::call(vm, target, &method, args, span) + if !matches!(target, Value::Symbol(_) | Value::Module(_)) { + return methods::call(vm, target, &field, args, span) .trace(vm.world, point, span); - }; - (value, args) + } + (target.field(&field).at(field_span)?, args) } } else { (callee.eval(vm)?, args.eval(vm)?) diff --git a/src/syntax/ast.rs b/src/syntax/ast.rs index 1cc29b04..e844f622 100644 --- a/src/syntax/ast.rs +++ b/src/syntax/ast.rs @@ -426,11 +426,14 @@ node! { impl Shorthand { /// A list of all shorthands. pub const LIST: &[(&'static str, char)] = &[ + // Text only. ("~", '\u{00A0}'), ("--", '\u{2013}'), ("---", '\u{2014}'), ("-?", '\u{00AD}'), - ("...", '…'), + // Math only. + ("-", '\u{2212}'), + ("'", '′'), ("*", '∗'), ("!=", '≠'), ("<<", '≪'), @@ -450,6 +453,8 @@ impl Shorthand { ("[|", '⟦'), ("|]", '⟧'), ("||", '‖'), + // Both. + ("...", '…'), ]; /// Get the shorthanded character. diff --git a/src/syntax/lexer.rs b/src/syntax/lexer.rs index 471e437a..0bf7966f 100644 --- a/src/syntax/lexer.rs +++ b/src/syntax/lexer.rs @@ -380,17 +380,16 @@ impl Lexer<'_> { '\\' => self.backslash(), '"' => self.string(), - '*' => SyntaxKind::Shorthand, '.' if self.s.eat_if("..") => SyntaxKind::Shorthand, '|' if self.s.eat_if("->") => SyntaxKind::Shorthand, '|' if self.s.eat_if("=>") => SyntaxKind::Shorthand, - '!' if self.s.eat_if('=') => SyntaxKind::Shorthand, '<' if self.s.eat_if("<<") => SyntaxKind::Shorthand, - '<' if self.s.eat_if('<') => SyntaxKind::Shorthand, '>' if self.s.eat_if(">>") => SyntaxKind::Shorthand, - '>' if self.s.eat_if('>') => SyntaxKind::Shorthand, '<' if self.s.eat_if("=>") => SyntaxKind::Shorthand, '<' if self.s.eat_if("->") => SyntaxKind::Shorthand, + '!' if self.s.eat_if('=') => SyntaxKind::Shorthand, + '<' if self.s.eat_if('<') => SyntaxKind::Shorthand, + '>' if self.s.eat_if('>') => SyntaxKind::Shorthand, '<' if self.s.eat_if('=') => SyntaxKind::Shorthand, '>' if self.s.eat_if('=') => SyntaxKind::Shorthand, '<' if self.s.eat_if('-') => SyntaxKind::Shorthand, @@ -400,6 +399,7 @@ impl Lexer<'_> { '[' if self.s.eat_if('|') => SyntaxKind::Shorthand, '|' if self.s.eat_if(']') => SyntaxKind::Shorthand, '|' if self.s.eat_if('|') => SyntaxKind::Shorthand, + '*' | '\'' | '-' => SyntaxKind::Shorthand, '#' => SyntaxKind::Hashtag, '_' => SyntaxKind::Underscore, |
