如何在方案中将字符串转换为变量名 [英] How to convert string to variable-name in scheme
问题描述
如何在 Scheme REPL 中实现以下目标?从字符串创建变量名.
How can I achieve below in Scheme REPL? Create a variable name from a string.
=>(define (string->variable-name "foo") 12)
=>(define (string->variable-name "foo") 12)
=>foo
12
=>(+ foo 8)
=>(+ foo 8)
20
=>(set (intern "ANY-TEXT") 5)
=> (set (intern "ANY-TEXT") 5)
=>任何文本
5
我如何构建像字符串->变量名"这样的#procedure?(和变量名-> 字符串")?
How do I build a #procedure like "string->variable-name" (and "variable-name->string") ?
非常感谢.
推荐答案
如果你传递给 string->variable-name
的是总是一个字符串文字(即,不是包含字符串的变量),您可以使用将字符串文字转换为标识符的 syntax-case
宏来做到这一点:
If what you're passing to string->variable-name
is always a string literal (i.e., not a variable that contains a string), you can do that using a syntax-case
macro that transforms the string literal to an identifier:
(define-syntax string->variable-name
(lambda (stx)
(syntax-case stx ()
((_ str)
(string? (syntax->datum #'str))
(datum->syntax #'str (string->symbol (syntax->datum #'str)))))))
相反,variable-name->string
宏可能如下所示:
and conversely, a variable-name->string
macro could look like this:
(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
) 文字.
However, remember: this will only work if you are working with string (in case of string->variable-name
) or identifier (in case of variable-name->string
) literals.
另一方面,如果您希望能够反映当前 Scheme 环境中的名称,则标准 Scheme 不支持此功能.一些实现,例如 Guile 或 Racket,有这个能力.
If, on the other hand, you want the ability to reflect on names in your current Scheme environment, this is not supported by standard Scheme. Some implementations, like Guile or Racket, do have this capability.
这是一个 Guile 示例:
Here's a Guile example:
> (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
这篇关于如何在方案中将字符串转换为变量名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!