Lisp允许在调试生成实时堆栈帧期间重新编译代码段。我知道lisp是动态的,并且重新绑定与方法关联的符号很容易。但是,Lisp也很容易在函数内部重新定义单个表单。这比C#和Java调试器可以做的更强大,更灵活。为什么以及如何运作?为什么现代语言不能提供相同水平的复杂性?我可以在哪里找到一些论文或书籍以便了解更多信息?
答案 0 :(得分:0)
这不是魔术。在过去的集会中,我也做了同样的事情。我创建了一个DOS TSR程序,它指出了我可以处理到我自己位置的中断。当你用零或类似的东西进行除法时,它跳进了我的程序,堆栈中所有以前的程序堆栈都出错了。我刚刚提供了一个方法来修复它,以便它不会以DOS默认行为退出。
在CL中你有一个默认的异常处理程序,它调用一个函数,你可以在重启时看到你的选项。重新启动就像错误源自的范围内的代码以及修复情况的方法。可以使用任何具有异常和闭包的语言来制作类似的东西。调试器和重新启动成为正在运行的程序的一部分,因此以更低的性能为代价变得更加安全。 Here is a JavaScript implementation
有一种方法可以将其关闭,它可能会使您的程序在CL中更快。该标准不需要做任何事情,因此它是可选的,但实现确实会产生不安全的快速代码,最终可能会导致分段错误,而不是调试器。