2015-09-26 70 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函數的第一步。