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

时间:2014-01-17 02:47:12

标签: string variables scheme

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

  

=>(define(string-> variable-name“foo”)12)

     

=>富

     

12

     

=>(+ foo 8)

     

20

In Common Lisp, this should be

  

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

     

=> ANY-TEXT

     

5

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

非常感谢。

2 个答案:

答案 0 :(得分: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)))))))

相反,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)文字时,这才有效。


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

这是一个Guile示例:

> (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

答案 1 :(得分:1)

暂时忘记语法:

(define string->variable-name string->symbol)

(define name->value-mapping '())

(define (name-set! name value)
  (set! name->value-mapping
        (cons (cons name value)
              name->value-mapping))
  value)

(define (name-get name)
  (cond ((assoc name name->value-mapping) => cdr)
        (else 'unbound)))

如果没有其他帮助,你肯定无法做(+ 5 <my-named-value>) ......