From 8a319647f7a5378a26aa57344dc9ed299e1bb791 Mon Sep 17 00:00:00 2001 From: Jean Carass Date: Sun, 31 Dec 2017 00:43:31 -0500 Subject: [PATCH] Create stacker-extended.rkt --- .../stacker-demo/stacker-extended.rkt | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 beautiful-racket-demo/stacker-demo/stacker-extended.rkt diff --git a/beautiful-racket-demo/stacker-demo/stacker-extended.rkt b/beautiful-racket-demo/stacker-demo/stacker-extended.rkt new file mode 100644 index 0000000..8ef8af7 --- /dev/null +++ b/beautiful-racket-demo/stacker-demo/stacker-extended.rkt @@ -0,0 +1,38 @@ +#lang br/quicklang + +(define (read-syntax path port) + (define args (port->lines port)) + (define handle-datums (format-datums '(handle ~a) args)) + (define module-datum `(module stacker-mod stacker-demo/stacker + ,@handle-datums)) + (datum->syntax #f module-datum)) +(provide read-syntax) + +(define-macro (stacker-module-begin HANDLE-EXPR ...) + #'(#%module-begin + HANDLE-EXPR ... + (display (first stack)))) +(provide (rename-out [stacker-module-begin #%module-begin])) + +(define stack empty) + +(define (pop-stack!) + (define arg (first stack)) + (set! stack (rest stack)) + arg) + +(define (push-stack! arg) + (set! stack (cons arg stack))) + +(define (handle [arg #f]) + (cond + [(number? arg) (push-stack! arg)] + [(or (equal? * arg) (equal? + arg) (equal? - arg) (equal? / arg)) + ; This will ensure that stacker can be extended to support - and / operations while keeping the RPN notation + (define operand2 (pop-stack!)) + (define operand1 (pop-stack!)) + (define op-result (arg operand1 operand2)) + (push-stack! op-result)])) +(provide handle) + +(provide + * - /)