summaryrefslogtreecommitdiffstats
path: root/srfi
diff options
context:
space:
mode:
authorGravatar Arvydas Silanskas 2022-02-18 10:59:13 +0200
committerGravatar Arvydas Silanskas 2022-02-18 10:59:13 +0200
commitd2585d6581793502cf89a7909732d0233ed59f25 (patch)
tree0f17035b552b445639eb17fd3529e52d1eb71d3d /srfi
parentupdate implementation dependency (diff)
make 125, 126 impure only
Diffstat (limited to 'srfi')
-rw-r--r--srfi/default-impl.scm47
-rw-r--r--srfi/srfi-125-impl.scm76
-rw-r--r--srfi/srfi-126-impl.scm68
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))