[Emacs 25] Thunk - Lazy form evaluation

Metadata

  • 来源: Emacs 25 内置
  • Summary: Lazy form evaluation

About

Elisp 函数调用时,参数都会被先计算出来,但如果某些参数用不上的话,相应的计算也就浪费了。比如 (* 0 (factorial 100)),用不着计算 100! 也能知道结果是 0。这种情况可以用 lazy evaluation,来保证:

  • 如果用不得上,不计算 100!(按需计算)
  • 否则,计算一次(且仅一次) 100! (避免重复计算)

Example

;; 没打印 hi,说明没有计算 (message ...
(my-mult 0 (thunk-delay (message "hi") (line-number-at-pos)))
     => 0

;; 仅仅打印一次 hi,说明计算了一次 (message ...
(my-mult 10 (thunk-delay (message "hi") (line-number-at-pos)))
     |- hi
     => 320
3 个赞

貌似是从OnLisp里拿来的代码…

不清楚 Lisp,Thunk 只是个概念。一般编程语言都能实现,有些容易些,有些困难些,比如像 Emacs Lisp 这样的,需要写个宏 thunk.el 作为辅助,不然的话,手写不是很容易。

从Scheme 那里听说过类似的特性,应该是语言级的优化.

sicp 第一章好像就讨论过这个问题。。。我第一章没看完搁一边了 :sweat_smile: