; SPDX-FileCopyrightText: 2026 HernĂ¡n Ibarra Mejia ; ; SPDX-License-Identifier: MIT (define-library (srfi 280) (import (scheme base)) (export make-monad monad? monad-unit monad-bind do/m) (begin (define-record-type monad (make-monad unit bind) monad? (unit monad-unit) (bind monad-bind)) (define-syntax do/m (syntax-rules () ((_) (syntax-error "monad expected")) ((_ monad . forms) (let* ((unit (monad-unit monad)) (bind (monad-bind monad)) (then (lambda ($1 $2) (bind $1 (lambda (_) $2))))) (%do/m unit bind then . forms))))) (define-syntax %do/m (syntax-rules (define/m return/m) ((_ unit bind then) (syntax-error "action expected")) ; Base cases ((_ unit bind then (define/m var $)) (syntax-error "define/m cannot end actions")) ((_ unit bind then (return/m val)) (unit val)) ((_ unit bind then $) $) ; Inductive cases ((_ unit bind then (define/m var $) . forms) (bind $ (lambda (var) (%do/m unit bind then . forms)))) ((_ unit bind then (return/m val) . forms) (syntax-error "return/m should end actions")) ((_ unit bind then $ . forms) (then $ (%do/m unit bind then . forms)))))))