<?xml version="1.0"?>
<paste-with-annotations>
  <paste>
    <number>
      <integer>63340</integer>
    </number>
    <user>
      <string>GrayShade</string>
    </user>
    <title>
      <string>macros ~x(</string>
    </title>
    <contents>
      <string>#!mzscheme
(require mzlib/defmacro srfi/1)

(define-macro (&gt;&gt; x f) `(bind ,x (lambda _ ,f)))
(define-macro (&gt;&gt;= x f) `(bind ,x ,f))

(define-macro (do . exprs)
  (if (null? (cdr exprs))
      (car exprs)
      `(&gt;&gt; ,(car exprs) (do ,@(cdr exprs)))))

(define-macro (let-m binding expr)
  `(&gt;&gt;= ,(cadr binding)
        (lambda (,(car binding)) ,expr)))

(define-macro (let-m* bindings expr)
  `(let-m ,(car bindings)
          ,(if (null? (cdr bindings))
               expr
               `(let-m* ,(cdr bindings) ,expr))))

(define-macro (guard f) `(if ,f (return ()) mzero))

(define (concat-map f xs) (apply append (map f xs)))

(define list-return list)
(define (list-bind xs f) (concat-map f xs))
(define list-mzero '())

(define-macro (instance-monad name)
  `(define-macro (,(string-&gt;symbol (string-append &quot;monad-&quot; (symbol-&gt;string name))) expr)
     `(let ((bind ,(string-&gt;symbol (string-append (symbol-&gt;string ',name) &quot;-bind&quot;)))
            (return ,(string-&gt;symbol (string-append (symbol-&gt;string ',name) &quot;-return&quot;))))
        ,expr)))

(define-macro (instance-monadplus name)
  `(define-macro (,(string-&gt;symbol (string-append &quot;monadplus-&quot; (symbol-&gt;string name))) expr)
     `(let ((mzero ,(string-&gt;symbol (string-append (symbol-&gt;string ',name) &quot;-mzero&quot;))))
        ,expr)))

;(define-macro (declare-class name members)
;  (let ((s (map
;             (lambda (member)
;               `(,member ,(string-&gt;symbol (string-append (symbol-&gt;string name) &quot;-&quot; (symbol-&gt;string member)))))
;             members)))
;  `(define-macro (,(string-&gt;symbol (string-append &quot;instace-&quot; (symbol-&gt;string name))) expr)
;     `(let
;          ,,(map
;             (lambda (member)
;               `(,member ,(string-&gt;symbol (string-append (symbol-&gt;string name) &quot;-&quot; (symbol-&gt;string member)))))
;             members)
;        ,expr))))
(define-macro (declare-class name members)
  (let ((env (map
             (lambda (member)
               `(,member ,(string-&gt;symbol (string-append (symbol-&gt;string name) &quot;-&quot; (symbol-&gt;string member)))))
             members)))
  `(define-macro (,(string-&gt;symbol (string-append &quot;instace-&quot; (symbol-&gt;string name))) expr)
     `(let
          ,,env
        ,expr))))

;(instance-monad list)
;(instance-monadplus list)
(declare-class monad (return bind))

(define run-me
  (monad-list
   (monadplus-list
    (let-m* ((x (iota 4 1))
             (y (iota 4 1)))
            (do (guard (even? x))
              (guard (odd? y))
              (return (cons x y)))))))

</string>
    </contents>
    <universal-time>
      <integer>3424337956</integer>
    </universal-time>
    <channel>
      <string>None</string>
    </channel>
    <colorization-mode>
      <string>Scheme</string>
    </colorization-mode>
    <maybe-spam>
      <null/>
    </maybe-spam>
    <is-unicode>
      <keyword>TRUE</keyword>
    </is-unicode>
  </paste>
</paste-with-annotations>