-
Notifications
You must be signed in to change notification settings - Fork 1
Analyse
- Mulighed: Behold scopes.
- Fordel: JS har scopes så det er muligvis unødvendigt ekstra arbejde at ophøje alt.
- Mulighed: Ophøj alt til globalt niveau.
- Fordel: Koden til dette findes allerede fra den oprindelige oversætter.
- Problem: En anonym funktion i ML kan assignes til en val og bruges efterfølgende
- Problem: En funktion kan defineres ud fra en anden funktion hvor nogle argumenter er givet (curried functions)
- Mulighed: Repræsentation af anonyme funktioner kan gøres direkte i JS.
- Mulighed: Brug rekursive JS-funktioner
- Fordel: Direkte oversættelse
- Ulempe: Kan være uoptimeret/tungt i JS (dette skal undersøges og er pt en spekulation)
- Mulighed: Brug løkker
- Fordel: Kan være meget effektivt
- Ulempe: Mere kompliceret løsning
- Mulighed: Brug en trampolinfunktion
- Ulempe: Giver et konstant overhead som gør mindre rekursioner tungere end nødvendigt
- Fordel: Umiddelbart simpel løsning.
- Mulighed: repæsentér alle atomer som strenge
- Fordel: vi kan bruge TextIO direkte, da alt i sidste skal være strenge og hvis de skal være strenge på JS-siden skal der alligevel indsættes "..." omkring. Derudover har typetjekket fundet sted. Chars skal alligevel håndteres som strenge på JS-siden. Giver mulighed for en simplere abstrakt JS-syntaks.
- Mulighed: Bibehold typerne så langt ind i oversætteren som muligt og først konvertere til strenge ved output til JS-fil.
- Fordel: når typerne bibeholdes undgås det at blande dem.
- Ulempe: Den abstrakte JS-syntaks skal være mere kompleks end ovenstående.
- Udfordring: Overflow på heltal.
- Udfordring: Words, unsigned (JS har funktionen ParseInt(string, 16)). Kan være større end ML heltal da den er unsigned. Hexadecimal ser en smule forskelligt ud på ML ift. JS.
- Udfordring: Datatyper bliver i Lambda-sproget lavet om til lister (BLOCK med et tag på 3 og span er antallet af elementer). Typetjekket er foretaget og vi skal derfor ikke håndtere datatypen som andet end en liste i JS.
-
JS lader kun til at håndtere dynamiske lister kaldet arrays.
-
Fremtidige versioner giver muligvis mulighed for lister af fast længde, hvilket kunne bruges til tuples og records.
-
en mulighed til tupler pt er at bruge lister med et form for længdetjek; enten på ML-siden eller på JS-siden som et bibliotek.
-
Dicts giver ikke nogen fordele da disse kan udvides fuldstændig som lister
-
Alternativt skal begrænsingen ignoreres og antage at det bliver overholdt fra Moscow ML's side og at evt. udefrakommende indgreb (user input o.lign.) også overholder
-
Et problem ved ikke at håndtere afgrænsing af tupler (i.e. ved lister på JS-siden) er at eksterne moduler/funktioner/programmer kan tilgå/kalde de ML-JS oversatte funktioner med en liste der er længere end den originale tuples længde. Hvis tupler på JS-siden håndteres med løkker der arbejder på alle elementer i listen risikeres det at den ødelægger korrektheden, eftersom den kan arbejde på vilkårligt mange elementer.
-
Med ML's typetjek kan ovenstående ikke ske internt og ved kun at tilgå tupler via indeks og ikke løkker kompromitteres korrektheden ikke.
-
Records er en generaliseret form af tupler, hvorfor de kan håndteres på samme måde.
- Mulighed: Læg alle moduler i en stor JS-fil, hvor en liste af allerede åbne moduler vedligeholdes, så det samme modul ikke åbnes flere gange.
- Problem: Alt skal rekompileres ved en ændring i blot et enkelt modul.
- Problem: Scopes bliver et problem hvis alle ikke er globalt.
- Mulighed: Hver SML-fil tilsvarer en JS-fil som f.eks. i HTML kan linkes med en src=....
- Problem: Forskellige miljøer skal håndteres forskelligt. F.eks. Node.js og HTML/Web.
- Mulighed: Opdelt i simplere skridt mellem Lamda->JS abstrakt->JS. Semantikken oversættes til det abstrakte JS som umiddelbart direkte kan oversættes til JS med fokus på syntaks.
- Problem: Definition af nyt abstrakt sprog er ikke-trivielt.
- Mulighed: Direkte oversættelse mellem Lambda og JS.
- Problem: Hvert skridt kan hurtigt blive væsentligt større og komplekst. Her skal både tages højde semantik og syntaks.
- Mulighed: Direkte oversættelse mellem Moscow ML og JS. er dette Relevant?