10

これは私の前の質問へのフォローアップです。私は、Lisp コードがフォン ノイマン アーキテクチャ上のマシン コードと同じくらいホモイコニックであるとは確信していません。どちらの場合もコードがデータとして表現されることは明らかですが、Lisp よりも機械語でこのプロパティをはるかに自由に利用できることも明らかです。

マシン コードをいじくり回すと、コードの自己変更が非常に簡単になり、多くの場合偶然に (私の経験では) 面白い結果が得られます。単純な「0 ~ 15 の数字を出力する」プログラムを作成しているときに、ポインターの 1 つに「off by one」エラーが発生することがあります。レジスタ 1 にあるものを、次の命令を含むメモリ内のアドレスに誤ってダンプしてしまい、代わりにランダムな命令が実行されます。(ある種の「goto」の場合は常に素晴らしいです。神はそれがどこに行き着くのか、その後何をするのかを知っています)

コードとデータの間に分離はありません。すべてが同時に命令 (単なる NOP であっても) であり、ポインタであり、昔ながらの数値でもあります。また、目の前でコードが変更される可能性があります。

私が頭を悩ませてきた Lisp のシナリオを教えてください。次のプログラムがあるとします。

(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

ここで、私がやりたいことは、このプログラムに、* を + に変更し、<= を >= に変更し、そこのどこかに (+ 1 2 3) を貼り付けて、一般的に関数を盗聴する Lisp コードを追加することです。上。そして、結果として生じる絶対的な混乱をプログラムに実行させたいのです。

重要なポイント: サンプル コードに致命的なエラーがない限り、変更できるのはその-– More code goes here –-部分だけです。上に表示されているのはコードです。リスト全体を引用して変数に格納して、操作して同じ名前の別の関数として吐き出すことができるようにしたくありません。factorial をまったく別のものとして標準的に再定義したくありません。マシンコードのように、画面に表示されているコードが目の前で変化するようにしたいのです。

これが不可能/不合理な要求である場合、ホモイコニシティは言語が持っている、または持っていない個別の特性ではなく、スペクトルであり、Lisp は最先端ではないという考えが私の心の中でさらに固まるだけです。(あるいは、Lisp はホモイコニックであり、マシンコード風の自己変更を説明する他の用語を探しています)

4

1 に答える 1