这是对我之前的问题的跟进。我不相信 Lisp 代码与 Von Neumann 架构上的机器代码一样具有同义性。在我看来,在这两种情况下,代码都表示为数据,但很明显,您可以在机器代码中比在 Lisp 中更自由地利用此属性。
当乱搞机器代码时,自我修改代码非常容易,它总是会发生,通常是偶然的,并且(根据我的经验)会产生有趣的结果。在编写一个简单的“打印数字 0-15”程序时,我的一个指针可能会出现“减一”错误。我最终会不小心将寄存器 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
现在我想要在这个程序中添加一些 Lisp 代码,这些代码会将 * 更改为 +,将 <= 更改为 >=,将 (+ 1 2 3) 粘贴到某处,并且通常会破坏函数向上。然后我希望程序执行导致的绝对混乱。
关键点:除非我在示例代码中犯了一些致命错误,否则您只能更改该-– More code goes here –-
部分。您在上面看到的是代码。我不希望您引用整个列表并将其存储在变量中,以便可以将其作为具有相同名称的单独函数进行操作和吐出;我不希望将阶乘的标准重新定义为完全不同的东西。我想要那个我可以在屏幕上看到的代码在我眼前改变,就像机器代码一样。
如果这是一个不可能/不合理的要求,那么它只会进一步巩固我的想法,即同音性不是一种语言具有或不具有的离散属性,它是一个频谱,而 Lisp 并不处于最前沿。(或者,Lisp 就像它们来的一样,我正在寻找其他术语来描述机器代码式的自我修改)