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

ryr*_*yrd 3 string variables scheme

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

=>(define(string-> variable-name"foo")12)

=> FOO

12

=>(+ foo 8)

20

在Common Lisp中,这应该是

=>(设置(实习生"ANY-TEXT")5)

=>任何文字

如何构建#procedure,如"string-> variable-name"(和"variable-name-> string")?

非常感谢.

Chr*_*ung 6

如果您传递的string->variable-name内容始终是字符串文字(即,不是包含字符串的变量),则可以使用syntax-case将字符串文字转换为标识符的宏来执行此操作:

(define-syntax string->variable-name
  (lambda (stx)
    (syntax-case stx ()
      ((_ str)
       (string? (syntax->datum #'str))
       (datum->syntax #'str (string->symbol (syntax->datum #'str)))))))
Run Code Online (Sandbox Code Playgroud)

相反,variable-name->string宏可能看起来像这样:

(define-syntax variable-name->string
  (lambda (stx)
    (syntax-case stx ()
      ((_ id)
       (identifier? #'id)
       (datum->syntax #'id (symbol->string (syntax->datum #'id)))))))
Run Code Online (Sandbox Code Playgroud)

但是,请记住:只有在使用字符串(如果是string->variable-name)或标识符(如果是variable-name->string)文字时,这才有效.


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

这是一个Guile的例子:

> (module-define! (current-module) 'foo 12)
> foo
12
> (define varname 'bar)
> (module-define! (current-module) varname 42)
> bar
42
Run Code Online (Sandbox Code Playgroud)

和一个球拍示例:

> (namespace-set-variable-value! 'foo 12)
> foo
12
> (define varname 'bar)
> (namespace-set-variable-value! varname 42)
> bar
42
Run Code Online (Sandbox Code Playgroud)