diff options
| author | 2022-02-18 10:59:13 +0200 | |
|---|---|---|
| committer | 2022-02-18 10:59:13 +0200 | |
| commit | d2585d6581793502cf89a7909732d0233ed59f25 (patch) | |
| tree | 0f17035b552b445639eb17fd3529e52d1eb71d3d /srfi | |
| parent | update implementation dependency (diff) | |
make 125, 126 impure only
Diffstat (limited to 'srfi')
| -rw-r--r-- | srfi/default-impl.scm | 47 | ||||
| -rw-r--r-- | srfi/srfi-125-impl.scm | 76 | ||||
| -rw-r--r-- | srfi/srfi-126-impl.scm | 68 |
3 files changed, 74 insertions, 117 deletions
diff --git a/srfi/default-impl.scm b/srfi/default-impl.scm index e2ff29d..24b20d6 100644 --- a/srfi/default-impl.scm +++ b/srfi/default-impl.scm @@ -17,26 +17,41 @@ (if (dict-pure? dto dict) (dict-find-update dto dict key fail success) (dict-find-update! dto dict key fail success))) + + (define (dict-find-update*/dict dto dict key fail success) + (if (dict-pure? dto dict) + (dict-find-update dto dict key fail success) + (begin + (dict-find-update! dto dict key fail success) + dict))) (define (dict-delete-all* dto dict keys) (if (dict-pure? dto dict) (dict-delete-all dto dict keys) - (dict-delete-all! dto dict keys))) + (begin + (dict-delete-all! dto dict keys) + dict))) (define (dict-update* dto dict key updater fail success) (if (dict-pure? dto dict) (dict-update dto dict key updater fail success) - (dict-update! dto dict key updater fail success))) + (begin + (dict-update! dto dict key updater fail success) + dict))) (define (dict-filter* dto pred dictionary) (if (dict-pure? dto dictionary) (dict-filter dto pred dictionary) - (dict-filter! dto pred dictionary))) + (begin + (dict-filter! dto pred dictionary) + dictionary))) (define (dict-replace* dto dict key val) (if (dict-pure? dto dict) (dict-replace dto dict key val) - (dict-replace! dto dict key val))) + (begin + (dict-replace! dto dict key val) + dict))) (define (default-dict-empty? dto dictionary) (= 0 (dict-size dto dictionary))) @@ -85,7 +100,7 @@ (error "mismatch of key / values argument list" objs)) (else (let* ((key (car objs)) (value (cadr objs)) - (new-d (dict-find-update* dto dictionary key + (new-d (dict-find-update*/dict dto dictionary key (lambda (insert ignore) (insert value)) (lambda (key old-value update delete) @@ -108,7 +123,7 @@ (cond ((null? keylist) d) (else (let* ((key (car keylist)) - (new-d (dict-find-update* dto d key + (new-d (dict-find-update*/dict dto d key (lambda (_ ignore) (ignore)) (lambda (key old-value _ delete) @@ -124,12 +139,19 @@ (update key value)))) (define (default-dict-intern dto dictionary key failure) + (define pure (dict-pure? dto dictionary)) (dict-find-update* dto dictionary key (lambda (insert _) (let ((value (failure))) - (values (insert value) value))) + (if pure + (values (insert value) value) + (begin + (insert value) + value)))) (lambda (key value update _) - (values dictionary value)))) + (if pure + (values dictionary value) + value)))) (define (default-dict-update dto dictionary key updater failure success) (dict-find-update* dto dictionary key @@ -151,7 +173,9 @@ (lambda (key value) (define new-dict (dict-delete-all* dto dictionary (list key))) - (cont new-dict key value)) + (if (dict-pure? dto dictionary) + (cont new-dict key value) + (cont key value))) dictionary)))) (define empty? (dict-empty? dto dictionary)) (if empty? @@ -346,10 +370,13 @@ (call/cc get-next-value))) (define (default-dict-accumulator dto dict acc-proc) + (define pure (dict-pure? dto dict)) (lambda (arg) (if (eof-object? arg) dict - (set! dict (acc-proc dto dict (car arg) (cdr arg)))))) + (if pure + (set! dict (acc-proc dto dict (car arg) (cdr arg))) + (acc-proc dto dict (car arg) (cdr arg)))))) (define (default-dict-set-accumulator dto dict) (if (dict-pure? dto dict) diff --git a/srfi/srfi-125-impl.scm b/srfi/srfi-125-impl.scm index a63aba9..9431de8 100644 --- a/srfi/srfi-125-impl.scm +++ b/srfi/srfi-125-impl.scm @@ -1,75 +1,47 @@ (define hash-table-dto (let () - (define-syntax guard-immutable - (syntax-rules () - ((_ table body ... final-expr) - (if (t125-hash-table-mutable? table) - (let () - body ... - final-expr) - (let ((table (t125-hash-table-copy table #t))) - body ... - (let ((table (t125-hash-table-copy table #f))) - final-expr)))))) - (define (t125-hash-table-pure?* dto table) - (not (t125-hash-table-mutable? table))) + #f) (define (t125-hash-table-set* dto table . obj) - (guard-immutable table - (apply t125-hash-table-set! (cons table obj)) - table)) + (apply t125-hash-table-set! (cons table obj))) (define (t125-hash-table-update* dto table key updater fail success) - (guard-immutable table - (t125-hash-table-update! table key updater fail success) - table)) + (t125-hash-table-update! table key updater fail success)) (define (t125-hash-table-update/default* dto table key proc default) - (guard-immutable table - (t125-hash-table-update!/default table key proc default) - table)) + (t125-hash-table-update!/default table key proc default)) (define (t125-hash-table-intern* dto table key failure) - (guard-immutable table - (define val (t125-hash-table-intern! table key failure)) - (values table val))) + (t125-hash-table-intern! table key failure)) (define (t125-hash-table-pop* dto table) (if (t125-hash-table-empty? table) (error "popped empty dictionary") - (guard-immutable table - (define-values - (key value) - (t125-hash-table-pop! table)) - (values table key value)))) + (let () + (define-values + (key value) + (t125-hash-table-pop! table)) + (values table key value)))) (define (t125-hash-table-delete-all* dto table keys) - (guard-immutable table - (for-each + (for-each (lambda (key) (t125-hash-table-delete! table key)) - keys) - table)) + keys)) (define (t125-hash-table-map* dto proc table) - (guard-immutable table - (t125-hash-table-map! proc table) - table)) + (t125-hash-table-map! proc table)) (define (t125-hash-table-filter* dto proc table) - (guard-immutable table - (t125-hash-table-prune! + (t125-hash-table-prune! (lambda (key value) (not (proc key value))) - table) - table)) + table)) (define (t125-hash-table-remove* dto proc table) - (guard-immutable table - (t125-hash-table-prune! proc table) - table)) + (t125-hash-table-prune! proc table)) (define (t125-hash-table-find-update* dto table key fail success) ;; instead of running immediately, @@ -77,24 +49,18 @@ ;; to guarantee call in tail position (define (make-success-thunk value) (define (update new-key new-value) - (guard-immutable table - (unless (eq? new-key key) - (t125-hash-table-delete! table key)) - (t125-hash-table-set! table new-key new-value) - table)) + (unless (eq? new-key key) + (t125-hash-table-delete! table key)) + (t125-hash-table-set! table new-key new-value)) (define (remove) - (guard-immutable table - (t125-hash-table-delete! table key) - table)) + (t125-hash-table-delete! table key)) (lambda () (success key value update remove) )) (define (make-failure-thunk) (define (ignore) table) (define (insert value) - (guard-immutable table - (t125-hash-table-set! table key value) - table)) + (t125-hash-table-set! table key value)) (lambda () (fail insert ignore))) diff --git a/srfi/srfi-126-impl.scm b/srfi/srfi-126-impl.scm index 815b9cf..b4c9845 100644 --- a/srfi/srfi-126-impl.scm +++ b/srfi/srfi-126-impl.scm @@ -1,24 +1,12 @@ (define srfi-126-dto (let () - (define-syntax guard-immutable - (syntax-rules () - ((_ table body ... final-expr) - (if (t126-hashtable-mutable? table) - (let () - body ... - final-expr) - (let ((table (t126-hashtable-copy table #t))) - body ... - (let ((table (t126-hashtable-copy table #f))) - final-expr)))))) - (define (prep-dto-arg proc) (lambda (dto . args) (apply proc args))) (define (t126-hashtable-pure?* dto table) - (not (t126-hashtable-mutable? table))) + #f) (define (t126-hashtable-ref* dto table key fail success) (define-values (value found?) (t126-hashtable-lookup table key)) @@ -30,79 +18,55 @@ (t126-hashtable-ref table key default)) (define (t126-hashtable-set* dto table . obj) - (guard-immutable table - (let loop ((obj obj)) + (let loop ((obj obj)) (if (null? obj) #t (begin (t126-hashtable-set! table (car obj) (cadr obj)) - (loop (cddr obj))))) - table)) + (loop (cddr obj)))))) (define (t126-hashtable-delete-all* dto table keys) - (guard-immutable table - (for-each + (for-each (lambda (key) (t126-hashtable-delete! table key)) - keys) - table)) + keys)) (define (t126-hashtable-intern* dto table key default) - (guard-immutable table - (define val (t126-hashtable-intern! table key default)) - (values table val))) + (t126-hashtable-intern! table key default)) (define (t126-hashtable-update/default* dto table key updater default) - (guard-immutable table - (t126-hashtable-update! table key updater default) - table)) + (t126-hashtable-update! table key updater default)) (define (t126-hashtable-pop* dto table) (if (t126-hashtable-empty? table) (error "popped empty dictionary") - (guard-immutable table - (define-values - (key value) - (t126-hashtable-pop! table)) - (values table key value)))) + (t126-hashtable-pop! table))) (define (t126-hashtable-update-all* dto proc table) - (guard-immutable table - (t126-hashtable-update-all! table proc) - table)) + (t126-hashtable-update-all! table proc)) (define (t126-hashtable-filter* dto proc table) - (guard-immutable table - (t126-hashtable-prune! table + (t126-hashtable-prune! table (lambda (key value) - (not (proc key value)))) - table)) + (not (proc key value))))) (define (t126-hashtable-remove* dto proc table) - (guard-immutable table - (t126-hashtable-prune! table proc) - table)) + (t126-hashtable-prune! table proc)) (define (t126-hashtable-find-update* dto table key fail success) (define (handle-success value) (define (update new-key new-value) - (guard-immutable table - (unless (eq? new-key key) + (unless (eq? new-key key) (t126-hashtable-delete! table key)) - (t126-hashtable-set! table new-key new-value) - table)) + (t126-hashtable-set! table new-key new-value)) (define (remove) - (guard-immutable table - (t126-hashtable-delete! table key) - table)) + (t126-hashtable-delete! table key)) (success key value update remove)) (define (handle-fail) (define (ignore) table) (define (insert value) - (guard-immutable table - (t126-hashtable-set! table key value) - table)) + (t126-hashtable-set! table key value)) (fail insert ignore)) (define default (cons #f #f)) |
