Skip to content

Instantly share code, notes, and snippets.

@Djexus
Created September 20, 2011 20:22
Show Gist options
  • Save Djexus/1230207 to your computer and use it in GitHub Desktop.
Save Djexus/1230207 to your computer and use it in GitHub Desktop.
A simple program in Scheme to solve expressions step by step
#lang racket
(define expr-operator
(lambda (expr)
(car (cdr expr))))
(define expr-operand1
(lambda (expr)
(car expr)))
(define expr-operand2
(lambda (expr)
(car (cdr (cdr expr)))))
(define build-expr
(lambda (operator operand1 operand2)
(list operand1 operator operand2)))
(define get-operator
(lambda (operator)
(cond
((eq? operator '+) +)
((eq? operator '-) -)
((eq? operator '*) *)
((eq? operator '/) /)
((eq? operator '^) expt))))
(define solve-step
(lambda (expr)
(cond
((and (number? (expr-operand1 expr))
(number? (expr-operand2 expr)))
((get-operator (expr-operator expr))
(expr-operand1 expr)
(expr-operand2 expr)))
((number? (expr-operand1 expr))
(build-expr (expr-operator expr)
(expr-operand1 expr)
(solve-step (expr-operand2 expr))))
((number? (expr-operand2 expr))
(build-expr (expr-operator expr)
(solve-step (expr-operand1 expr))
(expr-operand2 expr)))
(else
(build-expr (expr-operator expr)
(solve-step (expr-operand1 expr))
(solve-step (expr-operand2 expr)))))))
(define solve
(lambda (expr)
(if (number? expr)
(list expr)
(cons expr (solve (solve-step expr))))))
(define main
(lambda ()
(display "[IN] ")
(for-each
(lambda (x) (display x) (newline))
(solve (read)))
(main)))
(main)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment