Lisp 同象性水平

Lisp 同象性水平,lisp,machine-code,self-modifying,homoiconicity,Lisp,Machine Code,Self Modifying,Homoiconicity,这是对我的建议的后续行动。我不相信Lisp代码和冯·诺依曼体系结构上的机器代码一样具有同源性。在这两种情况下,代码都是以数据表示的,这一点对我来说似乎很明显,但也很明显,在机器代码中可以比在Lisp中更自由地利用这个属性 当处理机器代码时,自我修改代码是如此容易,它总是发生,经常是偶然发生的,并且(以我的经验)会产生有趣的结果。在编写一个简单的“打印数字0-15”程序时,我的一个指针可能会出现“关闭一个”错误。我会意外地将寄存器1中的任何内容转储到内存中包含下一条指令的地址中,并执行一条随机指令

这是对我的建议的后续行动。我不相信Lisp代码和冯·诺依曼体系结构上的机器代码一样具有同源性。在这两种情况下,代码都是以数据表示的,这一点对我来说似乎很明显,但也很明显,在机器代码中可以比在Lisp中更自由地利用这个属性

当处理机器代码时,自我修改代码是如此容易,它总是发生,经常是偶然发生的,并且(以我的经验)会产生有趣的结果。在编写一个简单的“打印数字0-15”程序时,我的一个指针可能会出现“关闭一个”错误。我会意外地将寄存器1中的任何内容转储到内存中包含下一条指令的地址中,并执行一条随机指令。(当它是某种“goto”的时候总是很棒的。上帝知道它会在哪里结束,以及在那之后它会做什么)

代码和数据之间确实没有分离。所有东西同时是一条指令(即使它只是一个NOP)、一个指针和一个普通的旧数字。代码可能会在你眼前改变

请帮我解决一个口齿不清的场景,我一直在绞尽脑汁。假设我有以下程序:

(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
(defun阶乘(n)

(如果(这很容易。您只需要更改列表表示形式。您只需要一个Lisp解释器即可

通用Lisp实现为我们提供了一个Lisp解释器:

CL-USER 137 > (defun factorial (n)
                (if (<= n 1)
                    1
                  (* n (factorial (- n 1)))))
FACTORIAL

CL-USER 138 > (fifth (function-lambda-expression #'factorial))
(IF (<= N 1) 1 (* N (FACTORIAL (- N 1))))

CL-USER 139 > (fourth (fifth (function-lambda-expression #'factorial)))
(* N (FACTORIAL (- N 1)))

CL-USER 140 > (setf (first (fourth (fifth (function-lambda-expression
                                             #'factorial))))
                    '+)
+

CL-USER 141 > (fourth (fifth (function-lambda-expression #'factorial)))
(+ N (FACTORIAL (- N 1)))

CL-USER 142 > (factorial 10)
55

CL-USER 143 > (setf (first (fourth (fifth (function-lambda-expression
                                             #'factorial))))
                    '*)
*

CL-USER 144 > (factorial 10)
3628800

早期(70年代/80年代)在某些Lisp组中,开发人员不是使用文本编辑器编写Lisp代码,而是使用结构编辑器。编辑器命令直接更改Lisp代码的结构。

此外,inb4评论说,我屏幕上的代码不太可能在我眼前更改,因为它只是网页上的一些文本。如果你真的不明白是什么我的意思是,如果你不是在抱怨,我会尝试进一步澄清:)典型的机器代码不是“同音符号”虽然机器代码是一个位数组,但机器语言没有专门处理表示机器语言程序的位数组的工具。例如,给定一个位数组,你甚至不知道第17条指令从哪里开始,除非它们的长度完全相同。如果如果将代码插入模板,则必须重新计算和修补穿过插入点的分支偏移量。你需要一个大型例程库来执行任何操作,而机器语言中不包括这些例程。机器语言确实有专门操作表示机器语言程序的位数组的工具。每次使用“存储”指令,这正是正在发生的事情。听起来像是程序员stackexchange的问题……哈哈,哇。太棒了。我一直在为yonks寻找类似的东西。我想没有什么可以阻止你在REPL之外做这种事(因此,您可能会有一个递归函数,它会一次又一次地修改自身?)请注意,这不是可移植的Common Lisp,因为FUNCTION-LAMBDA-EXPRESSION可以返回NIL。@ThomasBartscher:是的。我还假设它是一个解释器,也是一个不可移植的东西。Common Lisp不仅与可移植语言有关,而且与个别实现有一定的自由度有关(解释器与编译器、开发与交付、优化、垃圾收集等等)。只需选择一个具有正确功能集的公共Lisp实现。
CL-USER 180 > (defun factorial (n)
                (if (<= n 1)
                    1
                  (progn 
                    (setf (first '#1=(* n (factorial (- n 1))))
                          (case (first '#1#)
                            (+ '*)
                            (* '+)))
                    #1#)))
FACTORIAL
CL-USER 181 > (factorial 10)
4555