You are looking at historical revision 1620 of this page. It may differ significantly from its current revision.

;;; Chicken Invaders bm2005-sep-03
;;; Catch the eggs in your basket
;;; usage: csi invader.scm
;;; 
;;; I am trying to understand continuations.. but still not sure!
;;; Author: bobmc@bobmc.net            License: GPL
(require 'ncurses )
(define STARTX 5)
(define STARTY 3)
(define ENDX 25)
(define ENDY 14)
(define ROW-BASKET 15)
(define *ypos* (+ STARTY 2))
(define *xpos* STARTX)
(define CHICK1 15)
(define *done* 0)
(define *last-key* 0)
;;; main loop of the game:- 
;;;   cc-play -> cc-drop-eggs -> cc-basket-steps -> cc-play
;;; called from main once, otherwise called from cc-basket-steps
(define (cc-play do-other-stuff)
  (refresh)
  (update-key)
  (call/cc cc-drop-eggs))
(define (cc-drop-eggs do-other-stuff)
  (mvaddstr  (- *ypos* 1)   CHICK1 "   ")
  (mvaddstr     *ypos*      CHICK1 " 0 ")
  (mvaddstr  (+ *ypos* 1)   CHICK1 "   ")
  (set! *ypos* (move-egg *ypos*))
  (call/cc cc-basket-steps))
;;; update the egg-catching basket
;;; the loop here apparently gets aborted and restarted after call/cc
(define (cc-basket-steps do-other-stuff)
  (let loop () 
    (when ( = *last-key* KEY_RIGHT)
   ( set! *last-key* 0)
   ( set! *xpos* ( + *xpos* 1))
   ( set! *xpos* ( min *xpos* ENDX))
   )
    (when ( = *last-key* KEY_LEFT)
   ( set! *last-key* 0)
   ( set! *xpos* ( - *xpos* 1))
   ( set! *xpos* ( max *xpos* STARTX))
   )
    (mvaddstr  ROW-BASKET *xpos* " \\__/ ")
    (call/cc cc-play )
    (loop)))
;;;; look for F1, left-arrow, right-arrow
(define ( update-key )
  (set! *last-key* ( char->integer (getch)))
  (when (= *last-key* (KEY_F 1) )
 (endwin)			; press F1 to exit
 (exit)))
;;; update egg dropping, keep in bounds
(define (move-egg y)
  (if ( > y ENDY )
      STARTY
      (+ y 1 )))
;;; initialize ncurses, start running ;;;  
(define (main)
  (initscr)
  (cbreak)
  (raw)
  (noecho)
  (keypad (stdscr) #t)
  (halfdelay 1)
  (curs_set 0)
  (set! *last-key* KEY_RIGHT)
  (mvaddstr  ROW-BASKET *xpos* " \\__/ ")
  (mvaddstr  1  15 "(_)>  (_)>")
  (refresh)
  (cc-play 0)
  (endwin) )
(main)
(exit)

What use are the call/cc statements in this program? It should work exactly the same (or even better, because of less wasted resources) if they were just replaced by normal calls. -- murphy