且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何在方案中将字符串转换为变量名

更新时间:2022-06-17 04:51:10

如果你传递给 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-&gt 的情况下)时才有效;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