繁体   English   中英

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

[英]Evaluate list in Racket with parameters

我正在生成如下列表,其中包含运算符,数字和参数:

'(* (+ 3 param1) param2)

我想用不同的参数进行评估和测试。 但是,如果我使用eval过程,那么阅读它似乎无法在运行时更改这些值。

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

这是另一种使用准引用的方法

(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函数的第一步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM