implement by using (picrin attribute)
This commit is contained in:
parent
688c41a402
commit
a85de7ff73
|
@ -1,30 +1,11 @@
|
||||||
(define-library (srfi 17)
|
(define-library (srfi 17)
|
||||||
|
|
||||||
(define-library (rename set!)
|
(import (except (scheme base) set!)
|
||||||
(import (scheme base))
|
(rename (prefix (only (scheme base) set!) %))
|
||||||
(export (rename set! %set!)
|
(picrin dictionary)
|
||||||
define
|
(picrin attribute)
|
||||||
quasiquote
|
(srfi 1)
|
||||||
letrec
|
(srfi 8))
|
||||||
let
|
|
||||||
error
|
|
||||||
apply
|
|
||||||
define-syntax
|
|
||||||
syntax-rules
|
|
||||||
lambda
|
|
||||||
if
|
|
||||||
quote
|
|
||||||
begin
|
|
||||||
vector-ref
|
|
||||||
string-ref
|
|
||||||
bytevector-u8-ref
|
|
||||||
vector-set!
|
|
||||||
string-set!
|
|
||||||
bytevector-u8-set!
|
|
||||||
list-set!))
|
|
||||||
|
|
||||||
(import (rename set!)
|
|
||||||
(srfi 1))
|
|
||||||
|
|
||||||
(define-syntax set!
|
(define-syntax set!
|
||||||
(syntax-rules ()
|
(syntax-rules ()
|
||||||
|
@ -33,30 +14,18 @@
|
||||||
((_ var val)
|
((_ var val)
|
||||||
(%set! var val))))
|
(%set! var val))))
|
||||||
|
|
||||||
(define setter-alist '())
|
|
||||||
|
|
||||||
(define setter
|
(define setter
|
||||||
(letrec ((setter
|
(letrec ((setter
|
||||||
(lambda (proc)
|
(lambda (proc)
|
||||||
(let ((probe (assv proc setter-alist)))
|
(receive (setter exists) (dictionary-ref (attribute proc)
|
||||||
(if probe
|
'setter)
|
||||||
(cdr probe)
|
(if exists
|
||||||
(error "No setter for " proc)))))
|
setter
|
||||||
|
(error "No setter found")))))
|
||||||
(set-setter!
|
(set-setter!
|
||||||
(lambda (proc setter)
|
(lambda (proc setter)
|
||||||
(set! setter-alist
|
(dictionary-set! (attribute proc) 'setter setter))))
|
||||||
(alist-cons proc setter setter-alist)))))
|
|
||||||
(set-setter! setter set-setter!)
|
(set-setter! setter set-setter!)
|
||||||
(set-setter! car set-car!)
|
|
||||||
(set-setter! cdr set-cdr!)
|
|
||||||
(set-setter! caar (lambda (p v) (set-car! (car p) v)))
|
|
||||||
(set-setter! cadr (lambda (p v) (set-car! (cdr p) v)))
|
|
||||||
(set-setter! cdar (lambda (p v) (set-cdr! (car p) v)))
|
|
||||||
(set-setter! cddr (lambda (p v) (set-cdr! (cdr p) v)))
|
|
||||||
(set-setter! vector-ref vector-set!)
|
|
||||||
(set-setter! string-ref string-set!)
|
|
||||||
(set-setter! bytevector-u8-ref bytevector-u8-set!)
|
|
||||||
(set-setter! list-ref list-set!)
|
|
||||||
setter))
|
setter))
|
||||||
|
|
||||||
(define (getter-with-setter get set)
|
(define (getter-with-setter get set)
|
||||||
|
@ -64,7 +33,13 @@
|
||||||
(set! (setter proc) set)
|
(set! (setter proc) set)
|
||||||
proc))
|
proc))
|
||||||
|
|
||||||
|
(set! (setter car) set-car!)
|
||||||
|
(set! (setter cdr) set-cdr!)
|
||||||
|
(set! (setter vector-ref) vector-set!)
|
||||||
|
(set! (setter string-ref) string-set!)
|
||||||
|
(set! (setter bytevector-u8-ref) bytevector-u8-set!)
|
||||||
|
(set! (setter list-ref) list-set!)
|
||||||
|
|
||||||
(export set!
|
(export set!
|
||||||
setter
|
setter
|
||||||
getter-with-setter
|
getter-with-setter))
|
||||||
setter-alist))
|
|
||||||
|
|
Loading…
Reference in New Issue