不使用eval读取符号值

时间:2014-01-18 20:37:31

标签: scheme eval

这可能是微不足道的事,但我 无法弄清楚哪条路是正确的。

假设我们有以下define s

(define foo1 "asd")
(define foo2 "qwe")
(define foo3 "zxc")
(define foo4 "rte")
(define foo5 "qlx")

然后

(define foos 
  '(foo1 foo2 foo3 foo4 foo5))

我想要的是获得包含的列表 foo.符号的值。

到目前为止,我正在做的是以下内容 (即在诡计中):

(define (foovals lst)
  (map (λ (x) (eval x (interaction-environment))) lst))

(foovals foos)

返回我想要的列表:

("asd" "qwe" "zxc" "rte" "qlx")

我想问的是: 有替代方法吗?即无需 首先使用eval

1 个答案:

答案 0 :(得分:1)

没有标准的方式来做你想要做的事情。但是,一些 Scheme实现提供了(特定于实现的)方法来访问模块/顶级变量。 (这些变量不提供对词汇(局部)变量的访问,只能访问顶级变量。)

以下是您如何执行此操作in Guile

(use-modules (srfi srfi-26))
(define (foovals lst)
  (map (cut module-ref (current-module) <>) lst))

请注意,module-refcurrent-module是特定于Guile的,不适用于其他Scheme实现。