如果我有此列表
'((x 3) (y 4) (z 2))
如何将3分配给x和y分配给4分,将z分配给2分别用来做数学运算?
3 + x
或
y + z
由于
答案 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