syndicate-2017/racket/syndicate/examples/actor/make.rkt

28 lines
1.1 KiB
Racket

#lang syndicate
;; Automagic "make"-like utility.
(require/activate syndicate/drivers/filesystem)
(require racket/string)
(require racket/system)
(require file/sha1)
(define (file->sha1 p)
(call-with-input-file p sha1))
(spawn (during (observe (file-content $name _ _))
(when (not (string-suffix? name ".c"))
(define name.c (string-append name ".c"))
(on-start (printf "Tracking ~a, to see if we can use it to build ~a\n" name.c name))
(on (asserted (file-content name.c file->sha1 $hash)) ;; nb. $hash, not _
(if hash
(begin (printf "~a has changed hash to ~a, recompiling\n" name.c hash)
(system* (find-executable-path "cc") "-o" name name.c))
(printf "~a doesn't exist.\n" name.c))))))
(spawn (on (asserted (file-content "." directory-list $files))
(for [(name-path (in-list files))]
(match (path->string name-path)
[(pregexp #px"(.*)\\.c" (list _ name))
(assert! (observe (file-content name file-exists? #t)))]
[_ (void)]))))