1 ;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*-
2 ;;;; *************************************************************************
3 ;;;; FILE IDENTIFICATION
5 ;;;; Name: pipes-examples.lisp
6 ;;;; Purpose: Pipe examples
7 ;;;; Programmer: Kevin M. Rosenberg
8 ;;;; Date Started: Apr 2000
10 ;;;; $Id: pipes-example.lisp,v 1.2 2002/11/07 20:26:13 kevin Exp $
12 ;;;; This file, part of pipes, is Copyright (c) 2002 by Kevin M. Rosenberg
14 ;;;; *************************************************************************
16 (in-package #:pipes-user)
19 (defun integers (&optional (start 0) end)
20 (if (or (null end) (<= start end))
21 (make-pipe start (integers (+ start 1) end))
25 (make-pipe a (fibgen b (+ a b))))
31 (defun divisible? (x y)
35 (pipe-filter #'(lambda (x) (not (divisible? x 7))) (integers)))
43 (not (divisible? x (pipe-head stream))))
44 (pipe-tail stream)))))
52 (defun scale-pipe (factor pipe)
53 (pipe-map #'(lambda (x) (* x factor)) pipe))
55 (defun sum-pipe (sum s)
57 (sum-pipe (+ sum (pipe-head s))
60 (defun partial-sums (s)
61 (make-pipe (pipe-head s) (sum-pipe 0 s)))
63 (defun pi-summands (n)
65 (pipe-map #'- (pi-summands (+ n 2)))))
68 (scale-pipe 4d0 (partial-sums (pi-summands 1))))
73 (defun euler-transform (s)
74 (let ((s0 (pipe-elt s 0))
78 (if (eql s1 s2) ;;; series has converged
80 (make-pipe (- s2 (/ (square (- s2 s1))
82 (euler-transform (pipe-tail s))))
86 (defun ln2-summands (n)
88 (pipe-map #'- (ln2-summands (1+ n)))))
91 (partial-sums (ln2-summands 1)))
93 (defun make-tableau (transform s)
95 (make-tableau transform
96 (funcall transform s))))
98 (defun accelerated-sequence (transform s)
100 (make-tableau transform s)))
103 (defun run-examples ()
104 (let ((*print-length* 20))
105 (format t "~&pi-stream: ~S"
106 (pipe-values (pi-stream) 10))
107 (format t "~&euler-transform: ~S"
108 (pipe-values (euler-transform (pi-stream)) 10))
109 (format t "~&accelerate-sequence: ~S"
111 (accelerated-sequence #'euler-transform (pi-stream)) 10))))