Skip to content

Instantly share code, notes, and snippets.

@Yoxem
Created February 7, 2021 23:47
Show Gist options
  • Save Yoxem/6b1ecc928f3e2f7c5a6af7d1cfc03e9c to your computer and use it in GitHub Desktop.
Save Yoxem/6b1ecc928f3e2f7c5a6af7d1cfc03e9c to your computer and use it in GitHub Desktop.
Expending expression in Racket
#lang racket
(define expr
'(+ (- 5 (* 4 3)) (* 7 (* 2 8))))
(struct exp-and-holder (exp holder) #:transparent)
(define (main-converter exp)
(let*
((var-holder '())
(exp-holder (exp-and-holder exp var-holder)))
(converter exp-holder)
)
)
(define (append-line x y)
(if (eq? x '())
`(,y)
(append x `(,y))))
(define (converter exp-holder)
(begin
(define exp (exp-and-holder-exp exp-holder))
(define holder (exp-and-holder-holder exp-holder))
(define lhs (cadr exp))
(define rhs (caddr exp))
(define return-holder holder)
(define return-exp exp)
(if (list? lhs)
(let* (
(lhs-counted (converter (exp-and-holder lhs holder)))
(new-holder (exp-and-holder-holder lhs-counted))
(lhs-tmp-var (gensym))
(append-holder-item `(def ,lhs-tmp-var ,(exp-and-holder-exp lhs-counted))))
(set! return-holder (append-line new-holder append-holder-item))
(display return-holder)
(set! return-exp `(,(car exp) ,lhs-tmp-var ,(list-ref exp 2)))
)
; if lhs is a constant
(let*
((lhs-tmp-var (gensym))
(append-holder-item `(def ,lhs-tmp-var ,lhs)))
(set! return-holder (append-line return-holder append-holder-item))
(set! return-exp `(,(car exp) ,lhs-tmp-var ,(list-ref exp 2)))))
(if (list? rhs)
(let* (
(rhs-counted (converter (exp-and-holder rhs return-holder)))
(new-holder (exp-and-holder-holder rhs-counted))
(rhs-tmp-var (gensym))
(append-holder-item `(def ,rhs-tmp-var ,(exp-and-holder-exp rhs-counted))))
(set! return-holder (append-line new-holder append-holder-item))
(display new-holder)(newline)
(set! return-exp `(,(car return-exp) ,(list-ref return-exp 1) ,rhs-tmp-var))
)
; if rhs is a constant
(let*
((rhs-tmp-var (gensym))
(append-holder-item `(def ,rhs-tmp-var ,rhs)))
(set! return-holder (append-line return-holder append-holder-item))
(set! return-exp `(,(car return-exp) ,(list-ref return-exp 1) ,rhs-tmp-var)))
)
(exp-and-holder return-exp return-holder)
))
;(exp-and-holder
; '(+ g91751 g91756)
; '((def g91747 5) (def g91748 4) (def g91749 3) (def g91750 (* g91748 g91749))
; (def g91751 (- g91747 g91750)) (def g91752 7) (def g91753 2) (def g91754 8) (def g91755 (* g91753 g91754)) (def g91756 (* g91752 g91755))))
(main-converter expr)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment