Skip to content

Instantly share code, notes, and snippets.

Created December 28, 2012 05:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save anonymous/4394782 to your computer and use it in GitHub Desktop.
Save anonymous/4394782 to your computer and use it in GitHub Desktop.
(define-syntax prefix-sum
(syntax-rules ()
((_ ((pvar ps) ...) body)
(prefix-sum* ((pvar ps) ...) 0 body))))
(define-syntax prefix-sum*
(syntax-rules ()
((_ () acc body) body)
((_ ((pvar ps) (pvar* ps*) ...) acc body)
(let ((pvar (+ ps acc)))
(prefix-sum* ((pvar* ps*) ...) pvar body)))))
(define-syntax condp
(lambda (x)
(syntax-case x ()
((_ (e0 g0 g ...) ...)
(with-syntax ([(np0 ...) (generate-temporaries #'(e0 ...))])
#'(lambdag@ (c)
(let ((sum-ps (exact->inexact (+ e0 ...))))
(prefix-sum ((np0 (/ e0 sum-ps)) ...)
((fresh ()
alwayso
(lambdag@ (c^)
(let ((rn (random 1.0)))
(let ((f (lambda (y)
(if (< rn y)
succeed
fail))))
((condu
((f np0) g0 g ...)
...)
c^)))))
c)))))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment