Add insert! for 3.25

Could do with some tidying up but seems to work OK.
This commit is contained in:
Oliver Payne 2022-05-12 22:57:59 +01:00
parent 2f2e704cf6
commit 791c601d29
1 changed files with 26 additions and 21 deletions

View File

@ -5,40 +5,44 @@
(define (make-table)
(list '*table*))
;;(define (find-record
(define (assoc key records)
(cond ((null? records) false)
((equal? key (caar records)) (car records))
(else (assoc key (cdr records)))))
(define (table? l)
(pair? (cdr l)))
(define (empty? table)
(not (list? (cdr table))))
(trace-define (lookup keys table)
(cond ((null? keys) (cdr table))
((not (table? table)) false)
((empty? table) false)
(else
(let ((subtable (assoc (car keys) (cdr table))))
(if subtable
(lookup (cdr keys) subtable)
false)))))
(define (insert! key-1 key-2 value table)
(let ((subtable (assoc key-1 (cdr table))))
(if subtable
(let ((record (assoc key-2 (cdr subtable))))
(define (insert! keys value table)
(trace-define (insert-subtable! keys subtable)
(if (and (not (null? keys))
(not (null? subtable)))
(let* ((key (car keys))
(record (assoc (car keys) (cdr subtable))))
(if record
(set-cdr! record value)
(if (= (length keys) 1)
(set-cdr! record value))
(set-cdr! subtable
(cons (cons key-2 value)
(cdr subtable)))))
(set-cdr! table
(cons (list key-1
(cons key-2 value))
(cdr table)))))
(cons (cons key
(if (= (length keys) 1)
value
'()))
(cdr subtable))))
(let ((next-subtable (assoc key (cdr subtable))))
(insert-subtable! (cdr keys) next-subtable)))))
(insert-subtable! keys table)
'ok)
(#%require (only racket/base module+))
(module+ test
@ -46,7 +50,8 @@
(test-begin
(define t (make-table))
(insert! 10 10 'a t)
(insert! '(10 10) 'a t)
(check-equal? (lookup '(10 10) t) 'a)
(check-equal? (lookup '(10 10 10) t) false))
)
(check-equal? (lookup '(10 10 10) t) false)
(insert! '(20) 'b t)
(check-equal? (lookup '(20) t) 'b)))