2015-09-26 71 views
2

我生成列表,如下面的,与运营商,数字和参数:评估名单球拍与参数

'(* (+ 3 param1) param2) 

,我想评价和使用不同的参数测试。但是,如果我使用eval过程,那么在周围阅读并不像我可以在运行时更改这些值。

有没有一个干净的方法来做到这一点?

回答

2

下面是一个选择,使用quasiquoting

(eval `(* (+ 3 ,param1) ,param2)) 

在上面的线,这两个参数将在运行时获取调用eval之前评估。例如:

(define param1 42) 
(define param2 43) 

(eval `(* (+ 3 ,param1) ,param2)) 
=> 1935 
1

注意

> (eval '(let ([param1 42] 
       [param2 43]) 
      (* (+ 3 param1) param2))) 
1935 

所以包装在let你表达你评估它。

+0

我用你的解决方案来制作更通用的解决方案,应该将它附加到你的答案或作出新的答案? – HedgepigMatt

1

如果要管理明确值在表达式中变量的结合,以评估与不同价值观的表达,你可以创建和操作一个明确的“环境”。

; create an empty environment 
(define (make-env)  
    '()) 

; create a new environment extending env with a new bind (var . value) 
(define (bind var value env) 
    (cons (cons var value) env)) 

; lookup var in env, if present returns the value, otherwise returns itself 
(define (lookup var env) 
    (cond ((null? env) var) 
     ((eq? (caar env) var) (cdar env)) 
     (else (lookup var (cdr env))))) 

(define (myEval exp env) 
    (define (substitute exp env) 
    (cond ((null? exp) '()) 
      ((number? exp) exp) 
      ((symbol? exp) (lookup exp env)) 
      (else (cons (substitute (car exp) env) (substitute (cdr exp) env))))) 
    (eval (substitute exp env))) 

(myEval '(* (+ 3 param1) param2) (bind 'param1 10 (bind 'param2 20 (make-env)))) 

功能myEval替代所有与环境内的相应的值的表达式中的变量,然后调用预定义的函数eval。请注意,环境的定义是定义您自己的eval函数的第一步。