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

【神奇的函数式编程语言的独特功能】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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值