Skip to content

Instantly share code, notes, and snippets.

@bdionne
Created December 19, 2012 16:22
Show Gist options
  • Save bdionne/4337968 to your computer and use it in GitHub Desktop.
Save bdionne/4337968 to your computer and use it in GitHub Desktop.
(define (delegating-getter-and-setter-syntax vars get-delegate set-delegate)
(let ((args-name (gensym "args"))
(an-arg-name (gensym "an-arg"))
(new-val-name (gensym "new-value"))
(loop-name (gensym "loop"))
(kws (map symbol->keyword vars)))
(list `(lambda ,args-name
(let ,loop-name ((,args-name ,args-name))
(if (null? ,args-name)
(append!
,(if (null? kws)
''()
`(let ((all-vals (,loop-name ',kws)))
(let ,loop-name ((vals all-vals)
(kws ',kws))
(if (null? vals)
'()
`(,(car kws) ,(car vals) ,@(,loop-name (cdr vals) (cdr kws)))))))
(,get-delegate))
(map (lambda (,an-arg-name)
(case ,an-arg-name
,@ (append
(map (lambda (kw v) `((,kw) ,v)) kws vars)
`((else (car (,get-delegate ,an-arg-name)))))))
,args-name))))
`(lambda ,args-name
(let ,loop-name ((,args-name ,args-name))
(or (null? ,args-name)
(null? (cdr ,args-name))
(let ((,an-arg-name (car ,args-name))
(,new-val-name (cadr ,args-name)))
(case ,an-arg-name
,@ (append
(map (lambda (kw v) `((,kw) (set! ,v ,new-val-name))) kws vars)
`((else (,set-delegate ,an-arg-name ,new-val-name)))))
(,loop-name (cddr ,args-name)))))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment