Implement till 3.30
This commit is contained in:
72
misc/agenda.scm
Normal file
72
misc/agenda.scm
Normal file
@@ -0,0 +1,72 @@
|
||||
(define (make-time-segment time queue)
|
||||
(cons time queue))
|
||||
(define (segment-time s) (car s))
|
||||
(define (segment-queue s) (cdr s))
|
||||
|
||||
(define (make-agenda) (list 0))
|
||||
(define (current-time agenda) (car agenda))
|
||||
(define (set-current-time! agenda time)
|
||||
(set-car! agenda time))
|
||||
(define (segments agenda) (cdr agenda))
|
||||
(define (set-segments! agenda segments)
|
||||
(set-cdr! agenda segments))
|
||||
(define (first-segment agenda) (car (segments agenda)))
|
||||
(define (rest-segments agenda) (cdr (segments agenda)))
|
||||
|
||||
(define (empty-agenda? agenda)
|
||||
(null? (segments agenda)))
|
||||
|
||||
(define (add-to-agenda! time action agenda)
|
||||
(define (belongs-before? segments)
|
||||
(or (null? segments)
|
||||
(< time (segment-time (car segments)))))
|
||||
(define (make-new-time-segment time action)
|
||||
(let ((q (make-queue)))
|
||||
(insert-queue! q action)
|
||||
(make-time-segment time q)))
|
||||
(define (add-to-segments! segments)
|
||||
(if (= (segment-time (car segments)) time)
|
||||
(insert-queue! (segment-queue (car segments))
|
||||
action)
|
||||
(let ((rest (cdr segments)))
|
||||
(if (belongs-before? rest)
|
||||
(set-cdr!
|
||||
segments
|
||||
(cons (make-new-time-segment time action)
|
||||
(cdr segments)))
|
||||
(add-to-segments! rest)))))
|
||||
(let ((segments (segments agenda)))
|
||||
(if (belongs-before? segments)
|
||||
(set-segments!
|
||||
agenda
|
||||
(cons (make-new-time-segment time action)
|
||||
segments))
|
||||
(add-to-segments! segments))))
|
||||
|
||||
(define (remove-first-agenda-item! agenda)
|
||||
(let ((q (segment-queue (first-segment agenda))))
|
||||
(delete-queue! q)
|
||||
(if (empty-queue? q)
|
||||
(set-segments! agenda (rest-segments agenda)))))
|
||||
|
||||
(define (first-agenda-item agenda)
|
||||
(if (empty-agenda? agenda)
|
||||
(error "Agenda is empty -- FIRST-AGENDA-ITEM")
|
||||
(let ((first-seg (first-segment agenda)))
|
||||
(set-current-time! agenda (segment-time first-seg))
|
||||
(front-queue (segment-queue first-seg)))))
|
||||
|
||||
(define (after-delay delay action)
|
||||
(add-to-agenda! (+ delay (current-time the-agenda))
|
||||
action
|
||||
the-agenda))
|
||||
|
||||
(define (propagate)
|
||||
(if (empty-agenda? the-agenda)
|
||||
'done
|
||||
(let ((first-item (first-agenda-item the-agenda)))
|
||||
(first-item)
|
||||
(remove-first-agenda-item! the-agenda)
|
||||
(propagate))))
|
||||
|
||||
'agenda-loaded
|
||||
26
misc/draw.scm
Normal file
26
misc/draw.scm
Normal file
@@ -0,0 +1,26 @@
|
||||
(define (draw-to-py painter name)
|
||||
(define py-name (string-append "misc/" name ".py"))
|
||||
(define img-name (string-append name ".png"))
|
||||
(define head (string-append
|
||||
"from PIL import Image, ImageDraw\n"
|
||||
"im = Image.new('RGB', (1921, 1081))\n"
|
||||
"draw = ImageDraw.Draw(im)\n"))
|
||||
(define tail (string-append
|
||||
"im.save('" img-name "', 'PNG')\n"))
|
||||
(let ((port (open-output-file py-name)))
|
||||
(define (draw-line v1 v2)
|
||||
(define n2s number->string)
|
||||
(display
|
||||
(string-append
|
||||
"draw.line(("
|
||||
(n2s (xcor-vect v1)) ", "
|
||||
(n2s (ycor-vect v1)) ", "
|
||||
(n2s (xcor-vect v2)) ", "
|
||||
(n2s (ycor-vect v2)) "), "
|
||||
"fill=128)\n") port))
|
||||
(display head port)
|
||||
(painter draw-line)
|
||||
(display tail port)
|
||||
(close-output-port port)))
|
||||
|
||||
|
||||
33
misc/queue.scm
Normal file
33
misc/queue.scm
Normal file
@@ -0,0 +1,33 @@
|
||||
; Queue implementation from 3.21
|
||||
(define (front-ptr queue) (car queue))
|
||||
(define (rear-ptr queue) (cdr queue))
|
||||
(define (set-front-ptr! queue item) (set-car! queue item))
|
||||
(define (set-rear-ptr! queue item) (set-cdr! queue item))
|
||||
|
||||
(define (empty-queue? queue) (null? (front-ptr queue)))
|
||||
|
||||
(define (make-queue) (cons '() '()))
|
||||
(define (front-queue queue)
|
||||
(if (empty-queue? queue)
|
||||
(error "FRONT called with an empty queue" queue)
|
||||
(car (front-ptr queue))))
|
||||
|
||||
(define (insert-queue! queue item)
|
||||
(let ((new-pair (cons item '())))
|
||||
(cond ((empty-queue? queue)
|
||||
(set-front-ptr! queue new-pair)
|
||||
(set-rear-ptr! queue new-pair)
|
||||
queue)
|
||||
(else
|
||||
(set-cdr! (rear-ptr queue) new-pair)
|
||||
(set-rear-ptr! queue new-pair)
|
||||
queue))))
|
||||
|
||||
(define (delete-queue! queue)
|
||||
(cond ((empty-queue? queue)
|
||||
(error "DELETE! called with an empty queue" queue))
|
||||
(else
|
||||
(set-front-ptr! queue (cdr (front-ptr queue)))
|
||||
queue)))
|
||||
|
||||
'queue-loaded
|
||||
Reference in New Issue
Block a user