我正在使用运算符,数字和参数生成以下列表:
'(* (+ 3 param1) param2)
我想用不同的参数评估和测试。但是如果我使用eval
过程,那么阅读它并不像我可以在运行时更改这些值。
有干净的方法吗?
答案 0 :(得分:2)
这是另一种选择,使用quasiquoting:
(eval `(* (+ 3 ,param1) ,param2))
在上面一行中,在调用eval
之前,将在运行时评估这两个参数。例如:
(define param1 42)
(define param2 43)
(eval `(* (+ 3 ,param1) ,param2))
=> 1935
答案 1 :(得分:1)
请注意
> (eval '(let ([param1 42]
[param2 43])
(* (+ 3 param1) param2)))
1935
在评估之前,请将表达式包装在let
中。
答案 2 :(得分: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
函数的第一步。