1(define plotter
2  (lambda (fx res x1 x2 y1 y2)
3    (let* ((dx (- x2 x1)) (dy (- y2 y1)) (delta (/ dx res))
4       (fstr (format "~a" fx))
5	   (f (eval (list 'lambda '(x) fx))))
6      (letrec
7	  ((scaled
8	    (lambda (f x y)
9	      (f
10	       (* res (/ (- x x1) dx))
11	       (* res (/ (- y y1) dy)))))
12       (scaled-d
13	    (lambda (f x y xd yd)
14	      (f
15	       (+ xd (* res (/ (- x x1) dx)))
16	       (+ yd (* res (/ (- y y1) dy))))))
17	   (plotit
18	    (lambda (x)
19	      (scaled draw-line x (f x))
20	      (if (< x x2) (plotit (+ x delta))))))
21	(draw-color 0 0 0)
22	(draw-font "Helvetica" 12)
23	(scaled draw-move 0 (* 1.1 y2)) (draw-string "y")
24	(scaled draw-move (* 1.1 x2) 0) (draw-string "x")
25	(draw-move
26	  (- (/ res 2)
27	     (/ (car (string-size fstr "Helvetica" 12)) 2))
28	  (+ 30 res))
29	(draw-string (format "~a" fstr))
30	(scaled draw-move 0 y1)
31	(scaled draw-line 0 y2)
32	(scaled-d draw-move 0 y2 -5 -7)
33	(scaled draw-line 0 y2)
34	(scaled-d draw-move 0 y2 +5 -7)
35	(scaled draw-line 0 y2)
36	(scaled draw-move x1 0)
37	(scaled draw-line x2 0)
38	(scaled-d draw-move x2 0 -7 -5)
39	(scaled draw-line x2 0)
40	(scaled-d draw-move x2 0 -7 +5)
41	(scaled draw-line x2 0)
42	(draw-color 255 0 0)
43	(scaled draw-move x1 (f x1))
44	(plotit x1)))))
45
46(plotter '(* x x x) 70 -5.0 5.0 -50.0 50.0)
47(plotter '(sin x) 50 -5.0 5.0 -1.0 1.0)
48(plotter '(* x (sin x)) 100 -25.0 25.0 -25.0 25.0)
49(plotter '(+ (* x x) (* -5 x) 6) 80 -1.0 5.0 -3.0 10.0)
50