please how can i edit this code in order to define a constant twopower function,which will look similar to the following definition: (define twoplus ’{fun {n} { n 2}}) Of course, twopower should not implement the function n 2, but 2n, for n a non-negative integer. for example if we use this test : the result will be 32 (test (interp-expr (parse ‘ {with {f ,twopowerg {f 5}})) 32) this is the original code: #lang plai (define-type F1WAE [num (n number?)] [add (lhs F1WAE?)(rhs F1WAE?)] [sub (lhs F1WAE?)(rhs F1WAE?)] [with (name symbol?) (named-expr F1WAE?) (body F1WAE?)] [id (name symbol?)] [app (fun-name symbol?) (arg F1WAE?)]) (define-type FunDef [fundef (fun-name symbol?) (arg-name symbol?) (body F1WAE?)]) ;; newest form of parse, with apply added in. (define parse (lambda (sexp) (cond [(number? sexp) (num sexp)] [(symbol? sexp) (id sexp)] [(list? sexp) (case (first sexp) [(+)(add (parse (second sexp)) (parse (third sexp)))] [(-) (sub (parse (second sexp)) (parse (third sexp)))] [(with) (with (first (second sexp)) (parse (second (second sexp))) (parse (third sexp)))] [else (app (first sexp) (parse (second sexp)))] )]))) ;; interp: F1WAE listof(fundef) -> number ;; evaluates F1WAE expressions by reducing them to their corresponding values (define interp (lambda (expr fundefs) (type-case F1WAE expr [num (n) n] [add (l r) (+ (interp l fundefs) (interp r fundefs))] [sub (l r) (- (interp l fundefs) (interp r fundefs))] [with (bound-id named-expr bound-body) (interp (subst bound-body bound-id (num (interp named-expr fundefs))) fundefs)] [id (v) (error 'interp "Free identifier")] [app (fun-name arg-expr) (local ([define the-fun-def (lookup-fundef fun-name fundefs)]) (interp (subst (fundef-body the-fun-def) (fundef-arg-name the-fun-def) (num (interp arg-expr fundefs))) fundefs))]))) ;; helper functions (define lookup-fundef (lambda (fun-name fundefs) (cond [(empty? fundefs) (error 'lookup-fundef "Function does not exist")] [else (if (symbol=? fun-name (fundef-fun-name (first fundefs))) (first fundefs) (lookup-fundef fun-name (rest fundefs)))]))) (define subst (lambda (expr sub-id val) (type-case F1WAE expr [num (n) expr] [add (l r) (add (subst l sub-id val) (subst r sub-id val))] [sub (l r) (sub (subst l sub-id val) (subst r sub-id val))] [with (bound-id named-expr bound-body) (if (symbol=? bound-id sub-id) (with bound-id (subst named-expr sub-id val) bound-body) (with bound-id (subst named-expr sub-id val) ;; added to take care of scope (subst bound-body sub-id val)))] [id (v)(if (symbol=? v sub-id) val expr)] [app (fun-name arg-expr) (app fun-name (subst arg-expr sub-id val))]))) ;; test (print "{double {double 5}}") (interp (parse '{double {double 5}}) (list (fundef 'double 'n (add (id 'n) (id 'n))))) --------------------------------------- Firas .M. Abu Hassan Web Developer SKITCE Alquds University -- This message has been scanned for viruses and dangerous content by SKITCE MailScanner, and is believed to be clean. _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users