aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2024-02-25 20:11:54 +0800
committerMistivia <i@mistivia.com>2024-02-25 20:11:54 +0800
commit515ecbf5a20a8e432a998b0a543bedcb1bd64cf4 (patch)
tree6353c603a8cf0276553f420205f8d1c730a318ce /lib
parente191b610c11326b587cf0b01fd6fc37b8d07bb19 (diff)
reorg code
Diffstat (limited to 'lib')
-rw-r--r--lib/obj.rkt32
-rw-r--r--lib/utils.rkt36
2 files changed, 68 insertions, 0 deletions
diff --git a/lib/obj.rkt b/lib/obj.rkt
new file mode 100644
index 0000000..8ffc401
--- /dev/null
+++ b/lib/obj.rkt
@@ -0,0 +1,32 @@
+#lang racket
+
+(provide obj-maker
+ obj-set
+ obj-show)
+
+(define (alist->obj alist)
+ (λ key
+ (if (null? key)
+ alist
+ (cadr (assoc (car key) alist)))))
+
+(define (obj-maker . fields)
+ (λ inits
+ (define alist (map list fields inits))
+ (alist->obj alist)))
+
+(define (obj-set record key value)
+ (define alist (record))
+ (define new-alist
+ (let loop ((new-list '()) (cur alist) (is-set #f))
+ (if (null? cur)
+ (if is-set
+ new-list
+ (cons (list key value) new-list))
+ (let ()
+ (if (eq? key (caar cur))
+ (loop (cons (list key value) new-list) (cdr cur) #t)
+ (loop (cons (car cur) new-list) (cdr cur) is-set))))))
+ (alist->obj new-alist))
+
+(define (obj-show x) (x)) \ No newline at end of file
diff --git a/lib/utils.rkt b/lib/utils.rkt
new file mode 100644
index 0000000..2ce8a51
--- /dev/null
+++ b/lib/utils.rkt
@@ -0,0 +1,36 @@
+#lang racket
+
+(provide get-lines
+ enumerate
+ repeat
+ split-list-by)
+
+(define (repeat n e)
+ (let loop ((i 0) (ret '()))
+ (if (>= i n)
+ ret
+ (loop (+ 1 i) (cons e ret)))))
+
+(define (get-lines fp)
+ (let loop ((lines '()))
+ (define l (read-line fp))
+ (if (eof-object? l)
+ (reverse lines)
+ (loop (cons l lines)))))
+
+(define (enumerate lst)
+ (let loop ((i 1) (ret '()) (remain lst))
+ (if (null? remain)
+ (reverse ret)
+ (loop (+ 1 i) (cons (list (car remain) i) ret) (cdr remain)))))
+
+(define (split-list-by e lst . eq)
+ (define cmp (if (null? eq) equal? eq))
+ (let loop ((ret '())
+ (cur '())
+ (lst lst))
+ (if (null? lst)
+ (reverse (cons (reverse cur) ret))
+ (if (cmp e (car lst))
+ (loop (cons (reverse cur) ret) '() (cdr lst))
+ (loop ret (cons (car lst) cur) (cdr lst))))))