[PRL] Perl to MzScheme, line-by-line

Matthias Felleisen matthias at ccs.neu.edu
Mon Sep 13 21:33:29 EDT 2004


Now eliminate the set! -- Matthias

On Sep 13, 2004, at 9:20 PM, Doug Orleans wrote:

> Here's a line-by-line translation of Jeff's Perl program to MzScheme,
> followed by my own rewrite.  Note that Jeff's program has a bug,
> triggered by "1705"; also, I think "0515" was meant to be "1715".
> (I fixed both of these in my rewrite.)
>
>
> #!/usr/local/bin/mzscheme -r
>
> (define days #(mon tue wed thu fri))
>
> ;; day -> constraints
> ;; a constraints is a vector of (start,stop) times
> (define constraints
>   #hash(
>   ;;       mitch          will
>   (mon . #("1200" "1330"  "1330" "1445"))
>   ;;       carl et al     will           sam            jeff
>   (tue . #("1145" "1705"  "1600" "2345"  "1100" "0515"  "0800" "1130"))
>   ;;       pl             will
>   (wed . #("1145" "1330"  "1145" "1445"))
>   ;;       mitch          mitch          mitch          will           
> will           sam
>   (thu . #("0900" "1100"  "1200" "1330"  "1330" "1445"  "1445" "1800"  
> "1800" "2100"  "1230" "1330"))
>   ;;       mitch          will           sam
>   (fri . #("0800" "2145"  "0800" "2145"  "1300" "1500"))
>   ))
>
> (define ok 1)
> (define start-hour 8)
> (define stop-hour 21)
> (display "Day ")
> (do ((h start-hour (add1 h))) ((> h stop-hour))
>   (let ((hour (if (< h 10) (format "0~a" h) h)))
>     (printf "~a00 " hour))
> )
> (newline)
> (do ((i 0 (add1 i))) ((>= i (vector-length days)))
>   (let* ((stack 0)
> 	 (day (vector-ref days i))
> 	 (cst (hash-table-get constraints day)))
>     (display day)
>     (do ((h start-hour (add1 h))) ((> h stop-hour))
>       (let ((hour (if (< h 10) (format "0~a" h) h)))
> 	(display " ")
> 	(do ((m 0 (+ m 15))) ((> m 45))
> 	  (do ((j 0 (+ j 2))) ((>= j (vector-length cst)))
> 	    (let* ((start (vector-ref cst (+ j 0)))
> 		   (stop  (vector-ref cst (+ j 1)))
> 		   (min (if (< m 10) (format "0~a" m) m))
> 		   (time (format "~a~a" hour min)))
> 	      (when (equal? time start) (set! stack (add1 stack)))
> 	      (when (equal? time stop)  (set! stack (sub1 stack)))
> 	  ))
> 	  (display (if (zero? stack) " " stack))
> 	)
>     ))
>     (newline)
> ))
>
> #!/usr/local/bin/mzscheme -r
>
> (require (lib "1.ss" "srfi"))		;count
>
> ;; day -> constraints
> ;; a constraints is a plist of (start,stop) times
> (define constraints
>   '(
>   ;;   mitch       will
>   (mon (1200 1330) (1330 1445))
>   ;;   carl et al  will        sam         jeff
>   (tue (1145 1705) (1600 2345) (1100 1715) (0800 1130))
>   ;;   pl          will
>   (wed (1145 1330) (1145 1445))
>   ;;   mitch       mitch       mitch       will        will        sam
>   (thu (0900 1100) (1200 1330) (1330 1445) (1445 1800) (1800 2100) 
> (1230 1330))
>   ;;   mitch       will        sam
>   (fri (0800 2145) (0800 2145) (1300 1500))
>   ))
>
> (define start-hour 8)
> (define stop-hour 21)
> (display "Day ")
> (do ((h start-hour (add1 h))) ((> h stop-hour))
>   (when (< h 10) (display "0"))
>   (display h) (display "00 "))
> (newline)
> (for-each
>  (lambda (day.cst)
>    (display (car day.cst))
>    (do ((h start-hour (add1 h))) ((> h stop-hour))
>      (display " ")
>      (do ((m 0 (+ m 15))) ((> m 45))
>        (let* ((t (+ m (* h 100)))
> 	      (n (count (lambda (c) (and (>= t (car c)) (< t (cadr c))))
> 			(cdr day.cst))))
> 	 (display (if (zero? n) " " n)))))
>    (newline))
>  constraints)
>
>
> --dougo at place.org
>
> _______________________________________________
> PRL mailing list
> PRL at lists.ccs.neu.edu
> https://lists.ccs.neu.edu/bin/listinfo/prl




More information about the PRL mailing list