foo 12 =>(+ foo 8)-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:58:07 27 4
gpt4 key购买 nike

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

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

=>foo

12

=>(+ foo 8)

20

In Common Lisp, this should be

=> (set (intern "ANY-TEXT") 5)

=> ANY-TEXT

5

如何构建像“string->variable-name”(和“variable-name->string”)这样的#procedure?

非常感谢。

最佳答案

如果您传递给 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)))))))

相反,variable-name->string 宏可能如下所示:

(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 的情况下)时才有效) 文字。


另一方面,如果您希望能够反射(reflect)当前 Scheme 环境中的名称,则标准 Scheme 不支持此功能。一些实现,比如 GuileRacket ,确实有这个能力。

这是一个 Guile 示例:

> (module-define! (current-module) 'foo 12)
> foo
12
> (define varname 'bar)
> (module-define! (current-module) varname 42)
> bar
42

和一个 Racket 示例:

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

关于string - 如何在方案中将字符串转换为变量名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21176956/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com