~/bin/demo

Thien-Thi Nguyen <[email protected]>
Newsgroups gmane.lisp.guile.user,gmane.lisp.guile.sources
Message-ID <[email protected]>
suppose you "work" at home and your inquisitive spouse, sibling, child,
neighbor, wandering postal worker, etc. asks you: "what the hell do you
actually DO on that computer?".  maybe the program below (munged to
taste) can help you answer them and get back to doing whatever you were
actually doing.

munging-to-taste hints: replace and/or augment "Projector demos" and
"guile-xlib demos" sections w/ other `defdemo' forms.  and so on.

thi


_____________________________________
#!/home/ttn/local/bin/guile -s
!#
;;; demo

(define *demo-version* "time-stamp: <2003-09-03 12:36:54 ttn>")

;;; Copyright (C) 2003 Thien-Thi Nguyen
;;; This program is released under GNU GPL v2 with ABSOLUTELY
;;; NO WARRANTY.  See http://www.gnu.org/copyleft/gpl.txt for details.

(define *demos* '())

(defmacro defdemo (name . body)
  `(define ,name
     (begin
       (set! *demos* (cons ',name *demos*))
       (lambda () ,@body))))

(define (child dir name . args)
  ;; ARGS can be a list of strings, or a thunk (evaluated after changing
  ;; directory to DIR) that returns a list of strings.
  (let ((pid (primitive-fork)))
    (if (= 0 pid)
        (let ((program (format #f "./~A" name))
              (args-thunk (if (and (not (null? args))
                                   (thunk? (car args)))
                              (car args)
                              (lambda () args))))
          (chdir dir)
          (let ((new-command-line `(,program ,@(args-thunk))))
            (set! command-line (lambda () new-command-line)))
          (load-from-path program))
        (waitpid pid))))

;; Projector demos

(define (Projector-demo name)
  (child "/home/ttn/build/MISC/Projector/examples" (format #f "~A.scm" name)))

(defdemo Projector-ttn            (Projector-demo 'ttn))
(defdemo Projector-testsdl        (Projector-demo 'testsdl))
(defdemo Projector-testprimitives (Projector-demo 'testprimitives))

;; guile-xlib demos

(defdemo circle-frisk
  (child "/home/ttn/codebits/scheme/xplay" "circle-frisk"
         (begin
           (use-modules (ttn dirutils))
           (lambda ()
             (cons "root"
                   (filtered-files
                    (lambda (file)
                      (and (not-dot-not-dotdot file)
                           (format #f "scripts/~A" file)))
                    "scripts"))))))

;; everything else

(set! *demos* (reverse *demos*))

(define (usage)
  (apply string-append
         "Usage: demo DEMO\n"
         "Run demonstration program DEMO, one of:\n"
         (map (lambda (d)
                (format #f "  ~A\n" d))
              *demos*)))

(use-modules ((scripts PROGRAM) :select (HVQC-MAIN)))

(HVQC-MAIN (command-line)
           (lambda (args)
             (cond ((= 1 (length args))
                    (display (usage))
                    (exit #t)))
             (let ((only-one? (= 2 (length args)))
                   (me (car args))
                   (c-n-f-d "could not find demo:")
                   (exit-val #t))       ; optimism is ok sometimes
               (for-each (lambda (name)
                           (let ((demo (false-if-exception (eval name))))
                             (cond ((thunk? demo)
                                    (or only-one?
                                        (format #t "~A: running demo: ~A\n"
                                                me name))
                                    (demo))
                                   (only-one?
                                    (error c-n-f-d name))
                                   (else
                                    (format #t "~A: ~A ~A\n" me c-n-f-d name)
                                    (set! exit-val #f)))))
                         (map string->symbol (cdr args)))
               exit-val))
           `(usage . ,usage)
           '(package . "~/bin scripts")
           `(version . ,*demo-version*))

;;; demo ends here


_______________________________________________
Guile-user mailing list
[email protected]
http://mail.gnu.org/mailman/listinfo/guile-user
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.