Zmiana składni języka - separator wyrażeń #5
Labels
No Label
bug
enhancement
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: s416496/musique#5
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Aktualnie, parsując następujący fragment
repeat 5 [ i | c + i ] inc 42
możemy zinterpretować to następująco (zaprezentowane przy pomocy JS):repeat(5, function(i) { play(c+i); }); inc(42);
repeat(5); (function(i) { play(c+i); })(inc(42));
Parser wrażliwy na argumentowość funkcji
Rozwiązaniem zachowującym aktualną składnię jest znanie argumentowości (liczby argumentów) każdej z funkcji. Wiedząc, że
repeat
przyjmuje 2 argumenty, ainc
1, łatwo jest wybrać poprawną wersję spośród powyższych - 1.Problemem jest to, że takie rozwiązanie jest masywną pesymizacją parsera (pogorszeniem jego wydajności), wymusza zwracanie uwagi na kolejność definicji w programie.
Niestety dopóki nie zaimplementujemy to nie wiemy jaką, więc trudno ocenić, czy taka pesymizacja wydajności parsera jest rozsądna.
Małe wtrącenie - niedecydowalność parsera
Bez wykonania programu, nie wiemy czy dwie ostatnie linie to
function(4); print(42)
czyfunction(4, print(42))
. Czyni to parsowanie dużo większym wyzwaniem gdyż nie można zrobić go na raz. (i uniemożliwia kompilację do kodu bajtowego, czy dalsze przetwarzanie drzew składniowych - optymalizację)Parser z seperatatorem wyrażeń
Powyższy przykład zostaje zapisany teraz następująco:
repeat 5 [ i | c + i ]; inc 42
.Taka składnia redukuje złożoność pamięciową oraz obliczeniową parsera. (Czyni też parsing potencjalnie decydowalnym)
Należy zwrócić uwagę, że języki takie jak Haskell czy OCaml, które mają podobny problem wymuszają separator wyrażeń. Haskell wspiera dwa formy separacji wywołań: opartą o białe znaki oraz opartą o
;
.Konkluzja
W związku z powyższym opisem problemu, postuluję wprowadzenie separatora wyrażeń. Dobrym wyborem wydaje się
;
, z uwagi na występowanie.
w literałach liczbowych (.
jest stowana w Smalltalku).Miałby on następujące przykrą konsekwencję brzydszych (i dłuższych!) literałów kolekcji, np:
chord [c; e; g]
, chyba, że ktoś nie lubi spacji to liczba znaków jest bez zmianchord[c;e;g]
.@pi w związku, z tym, że to duża decyzja dotycząca kształtu języka proponuję by każda osoba się wypowiedziała do 2022-05-04 bym mógł skończyć podstawowy parser w tym tygodniu.
changed due date to May 04, 2022
Po rozmowie na wydziale jestem przekonany, że taka zmiana jest konieczna. Z mojej strony akceptuję.
Wiem że się spóźniłem, ale zgadzam się. Zróbmy w ten sposób, będzie lepiej. Ale czy jako separator nie możnaby użyć ,?
By ciąg znaków przy braku stosowania spacji był rozróżnialny tylko
;
pasuje:,
jest używane już w notacji akordowej (co jest już obecną konwencją), npc13,
ma obniżony 3 dźwięk w akordzie;.
jest używane w notacji dziesiętnej6.28
Rozpatruję wyłącznie te 3 znaki jako separatory, z uwagi na łatwość ich wpisywania:
,.;
potrzebują wyłącznie wciśnięcia jednego klawisza.Można zmienić jeśli zostanie wyrażona niechęć wobec tego znaku, jest to zmiana banalna: wystarczy zmienić ten
case