欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

【神奇的函数式编程语言的独特功能】Lisp 的运行期修改、编译代码,并替换当前运行版本的试验...

发布时间:2025/6/15 编程问答 53 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【神奇的函数式编程语言的独特功能】Lisp 的运行期修改、编译代码,并替换当前运行版本的试验... 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

2019独角兽企业重金招聘Python工程师标准>>>

【神奇的函数式编程语言的独特功能】Lisp 的运行期修改、编译代码,并替换当前运行版本的试验

《实用 Common Lisp 编程》一书中提到一个 Lisp 神奇案例:运行在太空飞船上的一段代码在太空飞船飞离地球一亿英里时被发现有 BUG ,然后 Lisp 程序员远程调试、替换了有 BUG的代码,听起来很神奇。

然后有人在网上找到了这个故事的来源,出自 JPL实验室,就是当年钱学森前辈和冯.卡门等人参与联合创建的那个“喷气推动实验室”。具体的链接在这里 http://www.flownet.com/gat/jpl-lisp.html

看来这项功能果然很强大,但是这种描述不是很直观,那就在我们的环境上小小地实际试验一下,试验代码如下:

(defun test ()(loop (显示数字)(if (not (停止循环)) (return))))(defun 显示数字 ()(format t "111111111 ~%")(format t "222222222 ~%") )(defun 停止循环 ()(format t "输入 c 继续循环,输入其他任意键退出循环: ")(equal 'c (read *query-io*))) 试验的主体部分是这个函数 (显示数字),程序首次运行时,会顺序显示: 11111111111 22222222222 接着我们不停止程序,在程序运行期修改这个函数 (显示数字),把第一句注释掉,这样: (defun 显示数字 ();(format t "111111111 ~%")(format t "222222222 ~%") )

然后编译(C-c C-c),求值(C-x C-e),这时再看 REPL 中还在运行着的程序,就会发现函数 (显示数字)已经被替换为新版本了。

程序首次运行截图:

程序保持运行,修改函数后的运行截图:


经过上述试验,发现函数型语言确实可以很方便的在运行期替换函数,不过有一个条件就是该函数如果正在运行中就替换不了,什么意思呢?如果一个函数是循环输出一串数字,也就是说它始终在运行,这时就无法替换。

转载于:https://my.oschina.net/freeblues/blog/103633

总结

以上是生活随笔为你收集整理的【神奇的函数式编程语言的独特功能】Lisp 的运行期修改、编译代码,并替换当前运行版本的试验...的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。