(define-module (data stack) #:export (pop peek push) #:use-module (control monad) #:use-module (control monad state)) ;;; Simple stateful stack module for showing the state monad ;;; in action. These functions assume that they are in a ;;; (state list) monad. But dynamic types! ;;; TODO test these for empty stack (define (pop) (do st <- (get) let top = (car st) (put (cdr st)) (return-state top))) (define (peek) (do st <- (get) (return-state (car st)))) (define (push v) (do st <- (get) (put (cons v st))))