-- Types zonder arity We gebruiken types zonder arity (Int -> Int -> Void) ipv (Int Int -> Void) Waarom? Mooiere puurdere lambda-calculus. Is chill straks met hogere orde functies (denken we) Staat mooie shizzle zoals in Haskell toe (f :: a -> a, g :: a -> a, f = g) Simpeler om te parsen Con: wellicht kut met code generatie, wie weet. --- Functies en variabelen delen 1 namespace. Dat is met het oog op hogere orde functies, dan kan een parameter voor een functie een andere functie zijn, of een variabele en als die 2 aparte namespaces hebben is dat moeilijk onduidelijk / praktisch onmogelijke met type inteference --- Functies kunnen voor correct typechecken alleen functies gebruiken die DAARNA gedefinieerd zijn — Globaal gedefinieerde dingen worden als constanten beschouwd. Enkel in functies gedefinieerde vars zijn mutable. Twee redenen: 1 we behouden onze programmeurs voor het gebruik van globale state, want dat is de wortel van het kwaad. Daarnaast past het goed bij dat _alles_ op top level een functie is. Als je zegt i = next x; en x wijzigt tussendoor en je checkt dan weer i dan wordt i opnieuw geevalueerd en dat levert dan dus een andere waarde op, en dat wil je niet. — mbt code generation —- Globals zijn bestaan niet, ondingen. Lokale variabelen komen gewoon op de stack te staan in volgorde van declaratie. Int, Char, Bool worden gewoon normaal opgeslagen met hun waarde Tuple wordt opgeslagen dmv twee pointers naar de heap List wordt opgeslagen dmv een pointer, als die 0 is dan is het het einde. Als het een plek op de heap is dan wijst die plek naar de waarde, de volgende plek wijst dan naar de tail. Incomplete functies sla je op dmv heap pointer, plek van de pointer is het functieadres, plek erna is aantal gegeven argumenten, plekken erna zijn de argumenten. Dit is poor-mans higher order functions. Als we het pro willen doen is dat niet in de scope van het project.(closure, lambda's nodig etc) Functies callen gebeurt door eerst de oude frame pointer op de stack te duwen, dan omgekeert de argumenten van de functie. Bij afbraak herstel je gewoon de stack pointer naar de waarde onder het laatste argument.