List 用参数评估球拍中的列表

List 用参数评估球拍中的列表,list,parameters,eval,racket,List,Parameters,Eval,Racket,我正在生成具有运算符、数字和参数的列表,如以下所示: '(* (+ 3 param1) param2) 我想用不同的参数来评估和测试。但是,如果我使用eval过程,环顾一下它,我似乎无法在运行时更改这些值 有没有干净的方法可以做到这一点?请注意 > (eval '(let ([param1 42] [param2 43]) (* (+ 3 param1) param2))) 1935 因此,在计算表达式之前,请先将表达式包装在一个

我正在生成具有运算符、数字和参数的列表,如以下所示:

'(* (+ 3 param1) param2)
我想用不同的参数来评估和测试。但是,如果我使用
eval
过程,环顾一下它,我似乎无法在运行时更改这些值

有没有干净的方法可以做到这一点?

请注意

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

因此,在计算表达式之前,请先将表达式包装在一个
中,让它

这里有一个替代方法,使用:

在上行中,在调用
eval
之前,将在运行时对这两个参数进行评估。例如:

(define param1 42)
(define param2 43)

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

如果要显式管理值与表达式中变量的绑定,以便使用不同的值计算表达式,可以创建并操作显式“环境”

;创建一个空的环境
(定义(生成环境)
'())
; 创建一个使用新绑定(var.value)扩展环境的新环境
(定义(绑定变量值环境)
(cons(cons var值)环境)
; env中的lookup变量,如果存在,则返回值,否则返回自身
(定义(查找变量环境)
(条件((空?环境)变量)
((等式(caar环境)变量)(cdar环境))
(其他(查找变量(cdr环境(()()))))
(定义(myEval exp env)
(定义(替换exp env)
(cond((null?exp)“”())
((编号?exp)exp)
((符号?exp)(查找exp-env))
(其他(cons(替代品(汽车出口)环境)(替代品(cdr出口)环境)
(评估(替代exp env)))
(myEval'(*(+3参数1)参数2)(bind'param1 10(bind'param2 20(make env)))

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

我使用您的解决方案来制定一个更通用的解决方案,应该将其附加到您的答案中还是制定一个新的答案?
(define param1 42)
(define param2 43)

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