Skip to content

Instantly share code, notes, and snippets.

@gwatt
Created February 23, 2019 16:25
Show Gist options
  • Save gwatt/a26d3b6bbe93bb8e8c60f05bceb14306 to your computer and use it in GitHub Desktop.
Save gwatt/a26d3b6bbe93bb8e8c60f05bceb14306 to your computer and use it in GitHub Desktop.
Library re-exporting standard mutation procedures to always return the mutated object
(library (returning!)
(export set! set-car! set-cdr! vector-set! string-set!
hashtable-set! hashtable-update! hashtable-delete! hashtable-clear!
bytevector-copy! bytevector-fill!
bytevector-s8-set! bytevector-u8-set!
bytevector-s16-native-set! bytevector-s16-set! bytevector-u16-native-set! bytevector-u16-set!
bytevector-s32-native-set! bytevector-s32-set! bytevector-u32-native-set! bytevector-u32-set!
bytevector-s64-native-set! bytevector-s64-set! bytevector-u64-native-set! bytevector-u64-set!)
(import (prefix (rnrs) r6rs:)
(prefix (rnrs mutable-pairs) r6rs:)
(prefix (rnrs mutable-strings) r6rs:)
(rnrs syntax-case))
(r6rs:define-syntax returning!
(r6rs:lambda (x)
(syntax-case x ()
((k f (arg ...) ret? ...)
(with-syntax
((f^ (datum->syntax #'k
(r6rs:string->symbol
(r6rs:string-append "r6rs:"
(r6rs:symbol->string (syntax->datum #'f))))))
((ret . _) #'(ret? ... arg ...)))
#'(r6rs:define (f arg ...)
(f^ arg ...)
ret))))))
(r6rs:define-syntax set!
(r6rs:syntax-rules ()
((_ id expr)
(r6rs:begin
(r6rs:set! id expr)
id))))
(returning! set-car! (p x))
(returning! set-cdr! (p x))
(returning! vector-set! (v idx x))
(returning! string-set! (str idx ch))
(returning! hashtable-set! (ht k v))
(returning! hashtable-update! (ht k p d))
(returning! hashtable-delete! (ht k))
(r6rs:define hashtable-clear!
(r6rs:case-lambda
((ht) (r6rs:hashtable-clear! ht) ht)
((ht size) (r6rs:hashtable-clear! ht size) ht)))
(returning! bytevector-copy! (src src-start dst dst-start n) dst)
(returning! bytevector-fill! (bv x))
(returning! bytevector-s8-set! (bv n x))
(returning! bytevector-u8-set! (bv n x))
(returning! bytevector-s16-native-set! (bv n x))
(returning! bytevector-s16-set! (bv n x e))
(returning! bytevector-u16-native-set! (bv n x))
(returning! bytevector-u16-set! (bv n x e))
(returning! bytevector-s32-native-set! (bv n x))
(returning! bytevector-s32-set! (bv n x e))
(returning! bytevector-u32-native-set! (bv n x))
(returning! bytevector-u32-set! (bv n x e))
(returning! bytevector-s64-native-set! (bv n x))
(returning! bytevector-s64-set! (bv n x e))
(returning! bytevector-u64-native-set! (bv n x))
(returning! bytevector-u64-set! (bv n x e))
(returning! bytevector-ieee-single-native-set! (bv n x))
(returning! bytevector-ieee-single-set! (bv n x e))
(returning! bytevector-ieee-double-native-set! (bv n x))
(returning! bytevector-ieee-double-set! (bv n x e))
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment