我生成列表,如下面的,與運營商,數字和參數:評估名單球拍與參數
'(* (+ 3 param1) param2)
,我想評價和使用不同的參數測試。但是,如果我使用eval
過程,那麼在周圍閱讀並不像我可以在運行時更改這些值。
有沒有一個乾淨的方法來做到這一點?
我生成列表,如下面的,與運營商,數字和參數:評估名單球拍與參數
'(* (+ 3 param1) param2)
,我想評價和使用不同的參數測試。但是,如果我使用eval
過程,那麼在周圍閱讀並不像我可以在運行時更改這些值。
有沒有一個乾淨的方法來做到這一點?
下面是一個選擇,使用quasiquoting:
(eval `(* (+ 3 ,param1) ,param2))
在上面的線,這兩個參數將在運行時獲取調用eval
之前評估。例如:
(define param1 42)
(define param2 43)
(eval `(* (+ 3 ,param1) ,param2))
=> 1935
注意
> (eval '(let ([param1 42]
[param2 43])
(* (+ 3 param1) param2)))
1935
所以包裝在let
你表達你評估它。
如果要管理明確值在表達式中變量的結合,以評估與不同價值觀的表達,你可以創建和操作一個明確的「環境」。
; 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
函數的第一步。
我用你的解決方案來製作更通用的解決方案,應該將它附加到你的答案或作出新的答案? – HedgepigMatt