Merge pull request #163 from stibear/srfi17

implements srfi-17(generalized-set!)
This commit is contained in:
Yuichi Nishiwaki 2014-08-30 15:34:51 +09:00
commit 82ee8f9171
2 changed files with 46 additions and 0 deletions

View File

@ -22,6 +22,7 @@ list(APPEND PICLIB_SCHEME_LIBS
${PROJECT_SOURCE_DIR}/piclib/srfi/1.scm
${PROJECT_SOURCE_DIR}/piclib/srfi/8.scm
${PROJECT_SOURCE_DIR}/piclib/srfi/17.scm
${PROJECT_SOURCE_DIR}/piclib/srfi/26.scm
${PROJECT_SOURCE_DIR}/piclib/srfi/43.scm
${PROJECT_SOURCE_DIR}/piclib/srfi/60.scm

45
piclib/srfi/17.scm Normal file
View File

@ -0,0 +1,45 @@
(define-library (srfi 17)
(import (except (scheme base) set!)
(prefix (only (scheme base) set!) %)
(picrin dictionary)
(picrin attribute)
(srfi 1)
(srfi 8))
(define-syntax set!
(syntax-rules ()
((_ (proc args ...) val)
((setter proc) args ... val))
((_ var val)
(%set! var val))))
(define setter
(letrec ((setter
(lambda (proc)
(receive (setter exists) (dictionary-ref (attribute proc)
'@@setter)
(if exists
setter
(error "No setter found")))))
(set-setter!
(lambda (proc setter)
(dictionary-set! (attribute proc) '@@setter setter))))
(set-setter! setter set-setter!)
setter))
(define (getter-with-setter get set)
(let ((proc (lambda args (apply get args))))
(set! (setter proc) set)
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!
setter
getter-with-setter))