如何在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?
非常感谢。
答案 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不支持此功能。某些实现(如Guile或Racket)确实具有此功能。
这是一个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>)
......