Trace the execution of a Racket program using a substitutive model of computation.
Consider the following procedure definitions.
(define f
(lambda (x y)
(string-append x "-" (string-reverse x))))
(define g
(lambda (x y)
(string-append (f x x) " " (f y x)))))
(define h
(lambda (x y)
(string-append (g x y) "&" (g y x))))
Using our mental/substitutive model of computation for Racket programs, give a step-by-step evaluation of the following Racket expression.
(h "foo" "bar")