【神奇的函数式编程语言的独特功能】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 中还在运行着的程序,就会发现函数 (显示数字)已经被替换为新版本了。

程序首次运行截图:

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

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

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


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

你可能感兴趣的:(替换,修改,编译,函数型语言,运行期)