如何为球拍中的变量赋值?

时间:2014-01-20 14:56:31

标签: scheme variable-assignment racket

如果我有此列表

'((x 3) (y 4) (z 2))

如何将3分配给x和y分配给4分,将z分配给2分别用来做数学运算?

3 + x

y + z

由于

2 个答案:

答案 0 :(得分:4)

您可以使用let在Scheme中声明局部变量。例如,要使用列表中的给定值创建绑定:

(let ((x 3) (y 4) (z 2))
  (+ y z)) ; body

=> 6

现在,您可以在<body>部分中评估涉及声明变量的任何表达式。您甚至可以从绑定列表中创建let,例如使用宏:

(define-namespace-anchor a)
(define ns (namespace-anchor->namespace a))

(define-syntax my-let
  (syntax-rules ()
    [(_ lst exp)
     (eval `(let ,lst ,exp) ns)]))

(my-let '((x 3) (y 4) (z 2)) ; bindings as an association list
        '(+ y z))            ; expression to be evaluated

=> 6

上面创建了一个名为my-let的宏,它接收一个绑定列表和一个要用这些绑定计算的表达式,并返回评估结果。

答案 1 :(得分:1)

一种简单,直接且可移植的方法是使用assq定义一个访问器(在本例中为 getval ):

(define vars '((x 3) (y 4) (z 2)))
(define (getval sym) (cadr (assq sym vars)))

或其任何变体。然后使用如下:

(+ 3 (getval 'x))
=> 6

(+ (getval 'y) (getval 'z))
=> 6