String 如何在scheme中将字符串转换为变量名

String 如何在scheme中将字符串转换为变量名,string,variables,scheme,String,Variables,Scheme,我如何在Scheme REPL中实现以下目标?从字符串创建变量名 =>(定义(字符串->变量名“foo”)12) =>foo 十二, =>(+foo 8) 二十 =>(设置(实习生“任意文本”)5) =>任意文本 五, 如何构建类似“字符串->变量名”(和“变量名->字符串”)的过程 非常感谢。如果传递给string->variable name的始终是字符串文字(即,不是包含字符串的变量),则可以使用语法大小写宏将字符串文字转换为标识符: (define-syntax string->

我如何在Scheme REPL中实现以下目标?从字符串创建变量名

=>(定义(字符串->变量名“foo”)12)

=>foo

十二,

=>(+foo 8)

二十

=>(设置(实习生“任意文本”)5)

=>任意文本

五,

如何构建类似“字符串->变量名”(和“变量名->字符串”)的过程


非常感谢。

如果传递给
string->variable name
的始终是字符串文字(即,不是包含字符串的变量),则可以使用
语法大小写
宏将字符串文字转换为标识符:

(define-syntax string->variable-name
  (lambda (stx)
    (syntax-case stx ()
      ((_ str)
       (string? (syntax->datum #'str))
       (datum->syntax #'str (string->symbol (syntax->datum #'str)))))))
相反地,
变量名->字符串
宏可以如下所示:

(define-syntax variable-name->string
  (lambda (stx)
    (syntax-case stx ()
      ((_ id)
       (identifier? #'id)
       (datum->syntax #'id (symbol->string (syntax->datum #'id)))))))
但是,请记住:只有在使用字符串(在
string->variable name
的情况下)或标识符(在
variable name->string
的情况下)文本时,这才有效


另一方面,如果希望能够反映当前方案环境中的名称,则标准方案不支持此功能。有些实现,如或,确实具有此功能

下面是一个狡猾的例子:

> (module-define! (current-module) 'foo 12)
> foo
12
> (define varname 'bar)
> (module-define! (current-module) varname 42)
> bar
42
还有一个球拍的例子:

> (namespace-set-variable-value! 'foo 12)
> foo
12
> (define varname 'bar)
> (namespace-set-variable-value! varname 42)
> bar
42

暂时忘记语法:

(define string->variable-name string->symbol)

(define name->value-mapping '())

(define (name-set! name value)
  (set! name->value-mapping
        (cons (cons name value)
              name->value-mapping))
  value)

(define (name-get name)
  (cond ((assoc name name->value-mapping) => cdr)
        (else 'unbound)))

当然,如果没有其他帮助,你无法完成
(+5)

谢谢克里斯。你提到的代码对我不起作用。Petite Chez Scheme抱怨“异常:异常:无效语法字符串->变量名”我稍后会试试Racket,因为我使用的是Windows,所以我很难安装Guile。@ryrd您是如何尝试调用
string->syntax name
?正如我在回答中提到的,它只在使用字符串文本时有效,例如,
(string->syntax name“foo”)
。不能使用
(let((foo“bar”)(字符串->语法名称foo))
;我有一个语法保护来阻止它,错误消息告诉我你确实在尝试这样的事情,我的保护抓住了它。是的,我确实希望调用
string->variable name
作为一个常规的过程,这也
(define foo“bar”)(string->variable name foo)
应该可以工作,而
bar
现在也将是一个变量。我想把它作为一个过程来使用,但谢谢:-)@ryrd你到底想在高层次上做什么?穷人的
eval
?我一直觉得我们正在处理一个问题。@ryrd抱歉,这不是“高水平”。“高层次”基本上就是解释你为什么要做你正在做的事情。比如,您是真的试图通过名称访问顶级变量,还是可以使用哈希表来保存用户定义变量的列表?如果后者是可以的,那么您的问题就有一个可移植的方案解决方案(GoZoner的答案是该方案的一个变体,除了他/她使用的是哈希表以外)。这确实不是您应该做的事情,因为它与方案的主要设计元素相矛盾。(例如,虽然R6RS允许引入标识符,但R7RS收回了该功能)。你到底想完成什么?写自己的回复很容易;但这一切都取决于你想做什么。程序语言(如scheme)应该具有“通过其他变量创建变量”的能力。我不是一个程序员,只是一个编程迷,所以如果我错了,请告诉我。不是每一种编程语言都能做到一切。Scheme是一种关注点狭窄的小型语言;它不是为了满足每个人的需要而设计的。在正在运行的程序中,变戏法绑定到值的标识符不是方案的一部分。