Haskell



  • ertes schrieb:

    head . dropWhile (<= 110) . filter even . map (^2) $ [0..]

    Durch äquivalente Umformungen wird die Liste vollständig wegoptimiert

    und in Forth kann man - bei laufender Compilierung eines Wortes (!) - den Compiler ausschalten, den Interpreter anschalten, die fragliche Zahl (min x mit 2|x und x^2>=110) vom Interpreter berechnen lassen, das Ergebnis festverdrahtet in den Maschinencode einfügen, den Compiler wieder anschalten und den Rest des Programms compilieren.

    Da wird aber nicht so ein Buhei drum gemacht wie in der funktionalen Programmierung.



  • Das Konzept "Beispiel" hast du auch nicht verstanden, oder?

    In Haskell hindert dich niemand daran obige Funktion in GHCi auszuführen und das Ergebnis direkt in den Quelltext zu schreiben. Genauso wie dich daran in C++ oder Forth keiner hindert. Den großen Vorteil in der Unterbrechbarkeit des Kompiliervorgangs sehe ich nicht...



  • Irgendwer schrieb:

    Den großen Vorteil in der Unterbrechbarkeit des Kompiliervorgangs sehe ich nicht...

    Das ist mal wieder das Blub-Paradox 🙂 Oder du siehst den Wald vor Bäumen nicht, das ist nämlich nichts anderes als Metaprogrammierung.



  • !rr!rr_. schrieb:

    und in Forth kann man - bei laufender Compilierung eines Wortes (!) - den Compiler ausschalten, den Interpreter anschalten, die fragliche Zahl (min x mit 2|x und x^2>=110) vom Interpreter berechnen lassen, das Ergebnis festverdrahtet in den Maschinencode einfügen, den Compiler wieder anschalten und den Rest des Programms compilieren.

    Zeigst Du auch hier bitte den Code, der genau das schafft?



  • Oder du siehst den Wald vor Bäumen nicht, das ist nämlich nichts anderes als Metaprogrammierung.

    So kann man das natürlich auch sehen. Ich kenne mich mit Forth nicht aus, weswegen die Frage bestehen bleibt, ob der Compiler das selber macht - also Werte (auch komplexere wie diese Funktion) vorab berechnet - oder ob ich da selber die Kompilation unterbrechen muss (so wie es !rr!rr_. beschrieben hat).



  • volkard schrieb:

    Zeigst Du auch hier bitte den Code, der genau das schafft?

    : foo [ bar ] literal ... ;
    

    "[" schaltet den Compiler aus und den Interpreter an, "]" bewirkt das Umgekehrte, und "literal" baut das vom Interpreter errechnete Ergebnis von bar festverdrahtet in das Compilat ein.

    "bar" ist ein Wort, das das gefragte min x berechnet und ist dem geneigten Leser als Übung überlassen 😃



  • komplettes Beispiel für die wo kein Forth können:

    : bar 110 1 do i dup * 110 >= i 2 mod 0= and if i unloop exit then loop ;
    : foo [ bar ] literal ;
    foo . cr  ( "12" )
    


  • Danke. Habe anscheinend viel Forth vergessen.


Anmelden zum Antworten