Homoikonizitätsebenen [geschlossen]

Dies ist eine Fortsetzung meinervorherige Frage. Ich bin nicht davon überzeugt, dass Lisp-Code so homoikonisch ist wie Maschinencode auf einer Von Neumann-Architektur. Mir scheint klar zu sein, dass in beiden Fällen Code als Daten dargestellt wird, aber es scheint auch klar zu sein, dass Sie diese Eigenschaft im Maschinencode viel freier nutzen können als in Lisp.

Wenn Sie sich mit Maschinencode beschäftigen, ist es so einfach, sich selbst zu ändern, dass dies die ganze Zeit passiert, oft aus Versehen und mit (meiner Erfahrung nach) komischen Ergebnissen. Beim Schreiben eines einfachen Programms zum Drucken der Zahlen von 0 bis 15 kann es vorkommen, dass bei einem meiner Zeiger ein Fehler "um eins" auftritt. Ich werde versehentlich alles, was sich in Register 1 befindet, in der Adresse im Speicher ablegen, die den nächsten Befehl enthält, und stattdessen wird ein zufälliger Befehl ausgeführt. (Immer großartig, wenn es eine Art "goto" ist. Gott weiß, wo es enden wird und was es danach tun wird.)

Es gibt wirklich keine Trennung zwischen Code und Daten. Alles ist gleichzeitig eine Anweisung (auch wenn es nur ein NOP ist), ein Zeiger und eine einfache alte Nummer. Und es ist möglich, dass sich der Code vor Ihren Augen ändert.

Bitte helfen Sie mir bei einem Lisp-Szenario, bei dem ich mir den Kopf zerkratzt habe. Angenommen, ich habe folgendes Programm:

(defun factorial (n)
   (if (<= n 1)
       1
       (* n (factorial (- n 1)))))
; -- Demonstrate the output of factorial --
; -- The part that does the Self modifying goes here –
; -- Demonstrate the changed output of factorial

Nun möchte ich diesem Programm einen Lisp-Code anhängen, der das * in ein + ändert, das <= in ein> = ändert, irgendwo ein (+ 1 2 3) anbringt und im Allgemeinen die Funktion stört oben. Und dann möchte ich, dass das Programm das absolute Chaos ausführt, das daraus resultiert.

Entscheidender Punkt: Sofern im Beispielcode kein schwerwiegender Fehler aufgetreten ist, dürfen Sie nur den Code ändern-– More code goes here –- Teil. Was du oben siehstist der Code. Ich möchte nicht, dass Sie die gesamte Liste in Anführungszeichen setzen und in einer Variablen speichern, damit sie als separate Funktion mit demselben Namen bearbeitet und ausgegeben werden kann. Ich möchte keine standardmäßige Neudefinition von Fakultät als etwas völlig anderes. Ich möchte, dass dieser Code genau dort, wo ich ihn auf meinem Bildschirm sehen kann, sich vor meinen Augen ändert, genau wie der Maschinencode.

Wenn dies eine unmögliche / unvernünftige Anfrage ist, wird die Vorstellung, dass Homoikonizität keine eigenständige Eigenschaft ist, die eine Sprache besitzt oder nicht besitzt, sondern ein Spektrum ist und Lisp nicht an der Blutungsgrenze steht, in meinem Kopf weiter gefestigt. (Alternativ ist Lisp so homoikonisch wie sie kommen und ich suche nach einem anderen Begriff, um maschinencodeähnliche Selbstmodifikationen zu beschreiben.)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage