Poziomy homoikoniczności [zamknięte]

To jest kontynuacja mojegopoprzednie pytanie. Nie jestem przekonany, że kod Lisp jest tak homoiconic jak kod maszynowy w architekturze Von Neumanna. Wydaje mi się oczywiste, że w obu przypadkach kod jest reprezentowany jako dane, ale wydaje się również oczywiste, że można wykorzystać tę właściwość znacznie swobodniej w kodzie maszynowym niż w Lisp.

Kiedy wymyślasz kod maszynowy, samo modyfikujący kod jest tak prosty, że dzieje się to cały czas, często przez przypadek i (z mojego doświadczenia) przezabawne wyniki. Podczas pisania prostego programu „drukuj liczby 0-15” mogę mieć błąd „off by one” z jednym z moich wskaźników. Skończę przypadkowo zrzucając cokolwiek znajduje się w Rejestrze 1 do adresu w pamięci, który zawiera następną instrukcję, a zamiast tego zostanie wykonana instrukcja losowa. (Zawsze wspaniale, kiedy to coś w rodzaju „goto”. Bóg wie, gdzie to się skończy i co się stanie po tym wydarzeniu)

Naprawdę nie ma separacji między kodem a danymi. Wszystko jest jednocześnie instrukcją (nawet jeśli jest to tylko NOP), wskaźnikiem i zwykłym starym numerem. Kod może się zmienić na twoich oczach.

Pomóż mi w scenariuszu Lispa, który drapałem się po głowie. Powiedz, że mam następujący program:

(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

Teraz chcę dołączyć do tego programu jakiś kod Lisp, który zmieni * na +, zmieni <= na> =, a następnie wpisze gdzieś tam (+ 1 2 3) i generalnie zakłóci działanie funkcji w górę. A potem chcę, aby program wykonał absolutny bałagan, który powoduje.

Kluczowy punkt: chyba że popełniłem jakiś fatalny błąd w kodzie przykładowym, możesz tylko zmienić-– More code goes here –- część. Co widzisz powyżejto jest kod. Nie chcę, żebyś cytował całą listę i zapisywał ją w zmiennej, aby można ją było manipulować i wypluwać jako oddzielną funkcję o tej samej nazwie; Nie chcę standardowej redefinicji silni jako czegoś zupełnie innego. Chcę, żeby ten kod, który widzę na ekranie, zmieniał się na moich oczach, tak jak kod maszynowy.

Jeśli jest to niemożliwe / nierozsądne żądanie, to umacnia się tylko w moim przekonaniu, że homoikoniczność nie jest dyskretną właściwością, którą język ma lub nie ma, jest widmem, a Lisp nie znajduje się na krawędzi krwawienia. (Alternatywnie Lisp jest tak homoikoniczny, jak się pojawiają, i szukam innego terminu opisującego samodoskonalenie kodu maszynowego)

questionAnswers(1)

yourAnswerToTheQuestion