Skip to content

Instantly share code, notes, and snippets.

@mwgamera
Created April 19, 2019 07:53
Show Gist options
  • Save mwgamera/c9b2fd34e2ec03d81c1e58d6d1be22fa to your computer and use it in GitHub Desktop.
Save mwgamera/c9b2fd34e2ec03d81c1e58d6d1be22fa to your computer and use it in GitHub Desktop.
;; (match-let ((pattern values) ...) body)
(macro (match-let form)
(letrec
((match (lambda (var val)
(cond
((symbol? var)
`((,var ,val)))
((pair? var)
`(,@(match (car var) `(car ,val))
,@(match (cdr var) `(cdr ,val))))
((vector? var)
(let next ((i 0))
`(,@(match (vector-ref var i) `(vector-ref ,val ,i))
,@(if (< (+ 1 i) (vector-length var))
(next (+ 1 i)) '()))))
(#t '())
))))
(let ((vars (map car (cadr form)))
(vals (map cadr (cadr form)))
(body (cddr form))
(sym (gensym)))
`(let ((,sym (list ,@vals)))
(let ,(match vars sym) ,@body)))))
; (match-let (((non-empty x0 y0 x1 y1)
; (gimp-selection-bounds img)))
; (print `(width ,(- x1 x0)))
; (print `(height ,(- y1 y0)))
; '... )
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment