X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=jars.git;a=blobdiff_plain;f=mars.scm;fp=mars.scm;h=d2d73e32d29f7d08fe279f4a74034b40ebb9b96c;hp=ae70c886f915516b5dabcf560c70634815a5d253;hb=4ccb7fe4e20053cd189864142aeb3d1d6c59c118;hpb=0dba537bcbe1c483fb0d96b6e9a093e243a7c265 diff --git a/mars.scm b/mars.scm index ae70c88..d2d73e3 100644 --- a/mars.scm +++ b/mars.scm @@ -15,7 +15,7 @@ make-queue queue-owner queue-ptrs - dump-queue + dump-queues make-core run-mars) @@ -125,9 +125,7 @@ (norm-set! names-vec i n) (run-set-functions i n)) ((i 'name) (norm-ref names-vec i)) - (((? integer? i) v) ((norm-ref core-vec i) v)) - (('->addr (? integer? i)) (norm-addr i)) - (('dump i) + ((i 'dump) (let ((i1 (- i 4)) (i2 (+ i 4))) (let loop ((idx i1)) @@ -136,7 +134,10 @@ (print* "*")) (dump idx) (loop (+ idx 1)))))) - (('size) core-size))))) + (('size) core-size) + (((? integer? i) v) ((norm-ref core-vec i) v)) + (('->addr (? integer? i)) (norm-addr i)))))) + ;;; Programmes and task queues @@ -190,12 +191,15 @@ (define (queue-set-ptrs! queue ptrs) (set-cdr! queue ptrs)) - (define (dump-queue queue core) - (let loop ((ptrs (queue-ptrs queue))) - (unless (null? ptrs) - (core 'dump (car ptrs)) - (print) - (loop (cdr ptrs))))) + (define (dump-queues queues core) + (for-each (lambda (queue) + (print ";" (queue-owner queue)) + (for-each (lambda (ptr) + (core ptr 'dump) + (print)) + (cdr queue)) + (print)) + queues)) (define (prog->string prog) (conc ";redcode\n\n" @@ -213,20 +217,20 @@ ;;; Executive function ;; - (define (run-mars core queues steps-left . rest) - (let ((min-queue-count (if (null? rest) 2 (car rest)))) - (if (or (<= steps-left 0) - (< (length queues) min-queue-count)) - queues - (let* ((queue (car queues)) - (remaining-queues (cdr queues)) - (ptrs (queue-ptrs queue)) - (new-ptrs (execute-instr core (car ptrs) (queue-owner queue)))) - (if (null? new-ptrs) - (run-mars core remaining-queues (- steps-left 1)) - (begin - (queue-set-ptrs! queue (append (cdr ptrs) new-ptrs)) - (run-mars core (append remaining-queues (list queue)) (- steps-left 1)))))))) + (define (run-mars core queues steps-left min-queue-count) + (if (or (<= steps-left 0) + (< (length queues) min-queue-count)) + queues + (let* ((queue (car queues)) + (remaining-queues (cdr queues)) + (ptrs (queue-ptrs queue)) + (new-ptrs (execute-instr core (car ptrs) (queue-owner queue)))) + (if (null? new-ptrs) + (run-mars core remaining-queues (- steps-left 1) min-queue-count) + (begin + (queue-set-ptrs! queue (append (cdr ptrs) new-ptrs)) + (run-mars core (append remaining-queues (list queue)) + (- steps-left 1) min-queue-count)))))) (define (execute-instr core ptr name) ;; (print ptr "\t" (core ptr '->string) "\t(" name ")")