使用参数评估 Racket 中的列表
Evaluate list in Racket with parameters
我正在生成如下列表,其中包含运算符、数字和参数:
'(* (+ 3 param1) param2)
我想用不同的参数进行评估和测试。但是,如果我使用 eval
过程,仔细阅读它似乎无法在运行时更改这些值。
有干净的方法吗?
注意
> (eval '(let ([param1 42]
[param2 43])
(* (+ 3 param1) param2)))
1935
因此,在对表达式求值之前将其包裹在 let
中。
这里有一个替代方案,使用 quasiquoting:
(eval `(* (+ 3 ,param1) ,param2))
在上面的行中,两个参数将在运行时 在 调用 eval
之前进行评估。例如:
(define param1 42)
(define param2 43)
(eval `(* (+ 3 ,param1) ,param2))
=> 1935
如果您想显式管理值与表达式中变量的绑定,以便使用不同的值评估表达式,您可以创建和操作显式“环境”。
; 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
函数的第一步。
我正在生成如下列表,其中包含运算符、数字和参数:
'(* (+ 3 param1) param2)
我想用不同的参数进行评估和测试。但是,如果我使用 eval
过程,仔细阅读它似乎无法在运行时更改这些值。
有干净的方法吗?
注意
> (eval '(let ([param1 42]
[param2 43])
(* (+ 3 param1) param2)))
1935
因此,在对表达式求值之前将其包裹在 let
中。
这里有一个替代方案,使用 quasiquoting:
(eval `(* (+ 3 ,param1) ,param2))
在上面的行中,两个参数将在运行时 在 调用 eval
之前进行评估。例如:
(define param1 42)
(define param2 43)
(eval `(* (+ 3 ,param1) ,param2))
=> 1935
如果您想显式管理值与表达式中变量的绑定,以便使用不同的值评估表达式,您可以创建和操作显式“环境”。
; 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
函数的第一步。