From 92b8ff0c78aa887e603fe39b18d4e9a7b7591aee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pant=C5=AF=C4=8Dek?= Date: Sat, 25 Mar 2023 18:54:19 +0100 Subject: [PATCH] Prepare sub-key setting. --- member-parser.scm | 27 +++++++++++++++++++++------ member2-record.scm | 15 +++++++++++++++ 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/member-parser.scm b/member-parser.scm index 8a9d37d..1d8ab20 100644 --- a/member-parser.scm +++ b/member-parser.scm @@ -47,10 +47,17 @@ ;; Pass 3: Interpreter passes (define member-schema-interpreters `((pass-markers - ,(lambda (mr acc key value) - mr)) + ,(lambda (mr output key value) + (case key + ((studentstart studentstop suspendstart suspendstop) + (let ((marker (if (member key '(studentstart suspendstart)) + 'start + 'stop))) + mr)) + (else + mr)))) (info - ,(lambda (mr acc key value) + ,(lambda (mr output key value) mr)))) ;; Pass 0: Removes any comments and removes any leading and trailing @@ -133,9 +140,17 @@ (member-record-add-highlight mr number "Unknown key" 2 'warning) processed))))))) - ;; Pass 3+: Single interpreter pass - (define (interpreter-pass mr output-name input pass-proc) - (dict-set mr output-name '())) + ;; Pass 3+: Single interpreter pass - input must be + ;; dictionary. Output is top-level key of member record. + (define (interpreter-pass mr output input pass-proc) + (let loop ((keys (dict-keys input)) + (mr (dict-set mr output (make-dict)))) + (if (null? keys) + mr + (let ((key (car keys))) + (loop (cdr keys) + (pass-proc mr output key + (dict-ref input key))))))) ;; Pass 3+: Interpreter passes (define (interpret-member-file mr . starts) diff --git a/member2-record.scm b/member2-record.scm index e5868d5..c9e6cb0 100644 --- a/member2-record.scm +++ b/member2-record.scm @@ -33,6 +33,8 @@ member-record-input-file member-record-set member-record-add-highlight + member-record-sub-ref + member-record-sub-set member-record-tests! ) @@ -87,6 +89,19 @@ (cons (list line-number message pass type) (dict-ref mr 'highlights '())))) + ;; Returns a key from particular section + (define (member-record-sub-ref mr sec key . defaults) + (let ((sec-dict (dict-ref mr sec))) + (if (null? defaults) + (dict-ref sec-dict key) + (dict-ref sec-dict key (car defaults))))) + + ;; Sets a key in particular section + (define (member-record-sub-set mr sec key val) + (let ((sec-dict (dict-ref mr sec))) + (dict-set mr sec + (dict-set sec-dict key val)))) + ;; Self-tests (define (member-record-tests!) (run-tests