[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]


I just changed the mailing list so that it uses fully qualified domain
names instead of nicknames.  This is a test to see whether I made any

Just so this message isn't a total bore for those reading it, I thought
I'd include some amusing Scheme code.  It was inspired by the
programming language Icon.

    - Jonathan

(define (fail) (*fail*))

(define *fail*
  (lambda () (error "Please do (INIT) first.")))

(define cwcc call-with-current-continuation)

(define (init)
  (cwcc (lambda (c)
	  (set! *fail* (lambda () (c 'failed)))

(define (either a b)    ;a and b are thunks
  (let ((saved-fail *fail*))
    (cwcc (lambda (c)
	    (set! *fail* (lambda ()
			   (set! *fail* saved-fail)
			   (c (b))))

(define (bag-of a)     ;a is a thunk
  (let ((saved-fail *fail*)
	(l '()))
    (cwcc (lambda (c)
	    (set! *fail*
		  (lambda ()
		    (set! *fail* saved-fail)
		    (c l)))
	    (set! l (cons (a) l))

(define (member-of l)  ;generates members of list l
  (if (null? l)
      (either (lambda () (car l))
	      (lambda () (member-of (cdr l))))))

(define (fringe s)    ;generates fringe of s-expression s
  (if (null? s)
      (if (pair? s)
	  (either (lambda () (fringe (car s)))
		  (lambda () (fringe (cdr s))))

(define (f-equal? a b)  ;fails if not equal
  (if (equal? a b)

(define (dot proc g1 g2)  ;g1, g2 are thunks
  (let ((fail1 nil)
	(fail2 nil)
	(v1 nil))
    (set! fail2 (let ((fail0 *fail*))
		  (lambda ()
		    (set! *fail* fail0)
		    (let ((v2 (g2)))
		      (set! fail2 *fail*)
		      (set! *fail* fail1)
		      (proc v1 v2)))))
    (set! v1 (g1))
    (set! fail1 *fail*)

;;; Examples:
;;; (f-equal? (member-of '(a b c d)))
;;;	      (member-of '(e c f)))
;;;   =>  c
;;; (bag-of (lambda ()
;;;	      (dot list (lambda () (fringe '((a b) c)))
;;;			(lambda () (fringe '(d (e f)))))))
;;;   =>  ((c f) (b e) (a d))