next up previous
Next: 9.3 memoizationの追加 Up: 9 遅延評価(lazy evaluation) Previous: 9.1 遅延評価の実現

9.2 遅延評価の一般化

遅延評価を行なう部分は以下のような一般的な 手続きencapsulate, exposeで可能となる.

(defmacro encapsulate (form)
  `#'(lambda () ,form))
(defmacro expose (procedure)
  `(funcall ,procedure))
;;;
(defmacro stream-cons (object stream)
  `(list ,object (encapsulate ,stream)))

(defun stream-first (stream)
  (first stream))

(defun stream-rest (stream)
  (expose (second stream)))

(defun stream-endp (stream)
  (eq stream 'empty-stream))
これでたとえば,

> (setq a (stream-cons (expt 2 2)
         (stream-cons (expt 2 3) 'empty-stream)))
(4 (LAMBDA NIL (STREAM-CONS (EXPT 2 3) 'EMPTY-STREAM))) 
> (stream-first a)
4 
> (stream-first (stream-rest a))
8
となる.

generated through LaTeX2HTML. M.Inaba 平成18年5月7日