From 350353608e642b8366998475ca05f6c5b735fa26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pant=C5=AF=C4=8Dek?= Date: Sat, 25 Mar 2023 20:43:11 +0100 Subject: [PATCH] Streamline symbols in member-record. --- member-parser.scm | 2 +- member2-record.scm | 53 +++++++++++++++++++++++++++++++++++++++------- 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/member-parser.scm b/member-parser.scm index 98f7871..0adb2d3 100644 --- a/member-parser.scm +++ b/member-parser.scm @@ -246,4 +246,4 @@ (import member-parser) (member-parser-tests!) -(print (load-member-file (make-member-record "joe" "members/joe" '()))) +(print (load-member-file (make-member-record "joe" "members/joe" '(2803)))) diff --git a/member2-record.scm b/member2-record.scm index 016dc40..109ea48 100644 --- a/member2-record.scm +++ b/member2-record.scm @@ -47,18 +47,42 @@ member-student? member-existing? + member-nick + member-id + member-record-tests! ) (import scheme (chicken base) (chicken keyword) + (chicken irregex) dictionary testing month period configuration) + ;; Checks whether given string is a 4-digit decimal number. + (define (is-4digit-string? s) + (if (irregex-search (irregex "^[0-9]{4}$") s) + #t + #f)) + + ;; checks whether given symbol is a 4-digit one. + (define (is-4digit-symbol? s) + (is-4digit-string? + (symbol->string s))) + + ;; Returns the first 4-digit symbol from the list. + (define (get-4digit-symbol-from-list lst) + (let loop ((lst lst)) + (if (null? lst) + #f + (if (is-4digit-symbol? (car lst)) + (car lst) + (loop (cdr lst)))))) + ;; Creates new member record based on the file and symlinks ;; information received from the members directory. Any keyword ;; arguments are converted to respective symbols in the dictionary. @@ -66,7 +90,10 @@ (let loop ((args args) (pairs `((file-name . ,file-name) (file-path . ,file-path) - (symlinks . ,symlinks)))) + (symlinks . ,symlinks) + (id . ,(string->number + (symbol->string + (get-4digit-symbol-from-list (cons file-name symlinks)))))))) (if (null? args) (make-dict pairs) (if (not (keyword? (car args))) @@ -173,21 +200,31 @@ (and joined (month<=? joined (*current-month*))))) + ;; Nickname as string + (define (member-nick mr) + (member-record-info mr 'nick)) + + ;; Returns member id + (define (member-id mr) + (dict-ref mr 'id)) + ;; Self-tests (define (member-record-tests!) (run-tests member-record (test-equal? make-member-record - (make-member-record "1234" "members/1234" '("member")) - '((file-name . "1234") + (make-member-record '|1234| "members/1234" '(|member|)) + '((file-name . |1234|) (file-path . "members/1234") - (symlinks "member"))) + (symlinks |member|) + (id . 1234))) (test-equal? make-member-record - (make-member-record "1234" "members/1234" '("member") #:id 1234) - '((id . 1234) - (file-name . "1234") + (make-member-record '|1234| "members/1234" '(|member|) #:msg "msg") + '((msg . "msg") + (file-name . |1234|) (file-path . "members/1234") - (symlinks "member"))) + (symlinks |member|) + (id . 1234))) (test-equal? member-record-set (member-record-set '() #:id 1234) '((id . 1234)))