negative numbers; fixed duration builtin

This commit is contained in:
Robert Bendun 2023-01-10 06:41:08 +01:00
parent 0b8fd86680
commit 87cea02b45
12 changed files with 52 additions and 27 deletions

View File

@ -9,14 +9,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added ### Added
- Printing version number on non-quiet launch, or when provided `--version` or `:version`
- Builtin function documentation generation from C++ Musique implementation source code - Builtin function documentation generation from C++ Musique implementation source code
- New builtins: digits - New builtins: digits
- Negative numbers!
### Removed ### Removed
- Release builder, since it's separate part of the project - Release builder, since it's separate part of the project
### Fixed
- `ceil`, `round`, `floor` didn't behave well with negative numbers
- `duration` wasn't filling note length from context and summed all notes inside chord, when it should take max
- `try` evaluated arguments too quickly
## [0.3.1] ## [0.3.1]
### Fixed ### Fixed

View File

@ -74,7 +74,7 @@ r add 1, 3
n Wywołanie funkcji n Wywołanie funkcji
n nie przymujących argumentów n nie przymujących argumentów
m constant := (say 42, 10); m constant := (say 42, 10),
m say (call foo) m say (call foo)
p def constant(): p def constant():
p print(42) p print(42)
@ -199,7 +199,7 @@ c w SonicPi nie ma domyślnej długości nuty;
c za każdym razem trzeba ją definiować c za każdym razem trzeba ją definiować
n Zmiana oktawy do 4tej n Zmiana oktawy do 4tej
m oct 4; m oct 4,
c w SonicPi domyślna oktawa c w SonicPi domyślna oktawa
c jest ustalona jako 4 c jest ustalona jako 4

View File

@ -1071,9 +1071,11 @@ static Result<Value> builtin_duration(Interpreter &interpreter, std::vector<Valu
auto total = Number{}; auto total = Number{};
for (auto &arg : args) { for (auto &arg : args) {
Try(traverse(interpreter, std::move(arg), [&](Chord &c) { Try(traverse(interpreter, std::move(arg), [&](Chord &c) {
auto chord_length = Number();
for (Note &note : c.notes) { for (Note &note : c.notes) {
total += note.length ? *note.length : interpreter.current_context->length; chord_length = std::max(chord_length, note.length ? *note.length : interpreter.current_context->length);
} }
total += chord_length;
})); }));
} }
return total; return total;

View File

@ -105,7 +105,7 @@ auto Lexer::next_token() -> Result<std::variant<Token, End_Of_File>>
// Lex numeric literals // Lex numeric literals
// They may have following forms: 0, 0.1 // They may have following forms: 0, 0.1
if (consume_if(unicode::is_digit)) { if (consume_if(unicode::is_digit) || consume_if('-', unicode::is_digit)) {
while (consume_if(unicode::is_digit)) {} while (consume_if(unicode::is_digit)) {}
if (peek() == '.') { if (peek() == '.') {
consume(); consume();

View File

@ -242,7 +242,7 @@ parse_fractional:
.location = std::move(token.location) .location = std::move(token.location)
}; };
} }
result += Number{ frac, pow10(frac_end - num_end) }; result += Number{ (result.num < 0 ? -1 : 1) * frac, pow10(frac_end - num_end) };
} }
return result.simplify(); return result.simplify();

View File

@ -1,8 +1,8 @@
say (ceil (0 - 4)), say (ceil -4),
say (ceil (0 - 4.2)), say (ceil -4.2),
say (ceil (0 - 4.5)), say (ceil -4.5),
say (ceil (0 - 4.8)), say (ceil -4.8),
say (ceil (0 - 5)), say (ceil -5),
say (ceil 4), say (ceil 4),
say (ceil 4.2), say (ceil 4.2),

View File

@ -0,0 +1,5 @@
len (1/4),
say (duration (chord c e g)),
say (duration c),
say (duration (c hn e hn)),
say (duration (c 0.3)),

View File

@ -1,8 +1,8 @@
say (floor (0 - 4)), say (floor -4),
say (floor (0 - 4.2)), say (floor -4.2),
say (floor (0 - 4.5)), say (floor -4.5),
say (floor (0 - 4.8)), say (floor -4.8),
say (floor (0 - 5)), say (floor -5),
say (floor 4), say (floor 4),
say (floor 4.2), say (floor 4.2),

View File

@ -1,17 +1,17 @@
say (range 0), say (range 0),
say (range (0 - 1)), say (range -1),
say (range 10), say (range 10),
say (range 1 10), say (range 1 10),
say (range 1 10 2), say (range 1 10 2),
say (up 0), say (up 0),
say (up (0 - 1)), say (up -1),
say (up 10), say (up 10),
say (up 1 10), say (up 1 10),
say (up 1 10 2), say (up 1 10 2),
say (down 0), say (down 0),
say (down (0 - 1)), say (down -1),
say (down 10), say (down 10),
say (down 1 10), say (down 1 10),
say (down 1 10 2), say (down 1 10 2),

View File

@ -1,8 +1,8 @@
say (round (0 - 4)), say (round -4),
say (round (0 - 4.2)), say (round -4.2),
say (round (0 - 4.5)), say (round -4.5),
say (round (0 - 4.8)), say (round -4.8),
say (round (0 - 5)), say (round -5),
say (round 4), say (round 4),
say (round 4.2), say (round 4.2),

View File

@ -270,6 +270,18 @@
"5" "5"
], ],
"stderr_lines": [] "stderr_lines": []
},
{
"name": "duration.mq",
"exit_code": 0,
"stdin_lines": [],
"stdout_lines": [
"3/4",
"1/4",
"1",
"3/10"
],
"stderr_lines": []
} }
] ]
} }

View File

@ -1,3 +1,3 @@
test: bin/debug/musique test: bin/$(os)/debug/musique
python3 scripts/test.py python3 scripts/test.py