Scheme 不使用eval读取符号值
这可能是一件非常琐碎的事情,但我 不知道该走哪条路 假设我们有以下定义Scheme 不使用eval读取符号值,scheme,eval,Scheme,Eval,这可能是一件非常琐碎的事情,但我 不知道该走哪条路 假设我们有以下定义 (define foo1 "asd") (define foo2 "qwe") (define foo3 "zxc") (define foo4 "rte") (define foo5 "qlx") 然后 (define foos '(foo1 foo2 foo3 foo4 foo5)) 我想要的是得到一个包含 foo.符号的值 到目前为止,我正在做以下工作 (即欺骗): 返回我想要的列表: ("asd" "qwe
(define foo1 "asd")
(define foo2 "qwe")
(define foo3 "zxc")
(define foo4 "rte")
(define foo5 "qlx")
然后
(define foos
'(foo1 foo2 foo3 foo4 foo5))
我想要的是得到一个包含
foo.
符号的值
到目前为止,我正在做以下工作
(即欺骗):
返回我想要的列表:
("asd" "qwe" "zxc" "rte" "qlx")
我想问的是:
有没有其他办法?也就是说,不必
首先使用
eval
?没有标准的方案方法来完成您想要做的事情。然而,一些方案实现提供了(特定于实现的)访问模块/顶级变量的方法。(它们不提供对词法(本地)变量的访问,只提供顶级变量。)
以下是您可以如何做到这一点:
(使用模块(srfi srfi-26))
(定义(foovals lst)
(地图(切割模块参考(当前模块))lst)
请注意,
module ref
和current module
是特定于Guile的,在其他方案实施中不起作用。您不使用eval
的动机是什么?它的设计正是为了满足您的需求。另外,它也是RnRS的一部分。@GoZoner我主要想知道我是否使用了正确的方法,或者是否有其他(更合适的)方法来实现它(假设我不能修改初始的定义s)。例如,获取符号值的替代方法。eval
的限制是只需要表达式才能工作。因此,(eval'(define foo“abc”)…)
是不能指望的(因为定义不是一个表达式)。(define foos(list foo1 foo2 foo3 foo4 foo5))
怎么了?@JoshuaTaylor最初的列表是引用的(我也对符号名称感兴趣,例如符号名称->文件名,符号值->“处理后的内容”)。当然你是绝对正确的!我总是可以将两个列表(带引号和不带引号)和zip
放在一起(而symbol->string
是第一个),然后使用它:)我确实怀疑还有其他几种方法可以获取列表((symbol name symbol value)…)
我不知道/想不起来(注意,foovals
实际上是(符号名称符号值)
生成部分的一部分)。我知道这是OP代码的诡计版本,但我在问题中没有看到任何解释问题的东西(定义foos(列出foo1 foo2 foo3 foo4 foo5))
。这不是一个更简单的解决方案吗?
("asd" "qwe" "zxc" "rte" "qlx")
(use-modules (srfi srfi-26))
(define (foovals lst)
(map (cut module-ref (current-module) <>) lst))