(use-modules (ice-9 match) (ice-9 rdelim)) (define (read-config path) (call-with-input-file path (lambda (port) (let loop ((line (read-line port)) (acc '())) (if (eof-object? line) acc (match (string-split line #\=) ((key-part value-part) (let ((key (string->symbol key-part)) (value (match value-part ("y" #t) ("n" #f) ("m" 'm) ((? (lambda (x) (string-prefix? "0x" x))) (string->number (substring value-part 2) 16)) (_ (call-with-input-string value-part read))))) (loop (read-line port) (cons `(,key . ,value) acc)))) (_ (loop (read-line port) acc)))))))) (define (kequal? a b) (or (equal? a b) (and (memq a '(m #t)) (memq b '(m #t))))) (match (program-arguments) ((_ p1 p2 p3) (let ((c1 (read-config p1)) (c2 (read-config p2)) (c3 (read-config p3))) (for-each (match-lambda ((k2 . v2) (let ((v1 (match (assq k2 c1) ((_ . v1) v1) (#f 'nil))) (v3 (match (assq k2 c3) ((_ . v3) v3) (#f 'nil)))) (unless (or (kequal? v1 v2) (kequal? v1 v3)) (write `(,k2 ,v1 -> ,v2 / ,v3)) (newline))))) c2))))