如何在方案中将字符串转换为变量名 [英] How to convert string to variable-name in scheme

查看:53
本文介绍了如何在方案中将字符串转换为变量名的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何在 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

在 Common Lisp 中,这应该是

=>(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 不支持此功能.一些实现,例如 GuileRacket,有这个能力.

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆