球拍语言:如何将字符串转换为变量名

Racket language: How to convert string to variable-name

提问人:Alex Correia 提问时间:8/17/2016 最后编辑:CommunityAlex Correia 更新时间:8/17/2016 访问量:2071

问:

我是 Racket 的新手,我尝试运行 Chris Jester-Young 的解决方案(如何在方案中将字符串转换为变量名)将字符串转换为变量名(反过来,换句话说,将变量名转换为字符串):

#lang racket
(define-syntax string->variable-name
   (lambda (stx)
   (syntax-case stx ()
     ((_ str)
       (string? (syntax->datum #'str))
         (datum->syntax #'str (string->symbol (syntax->datum #'str)))))))

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

这很好,这里举个例子:variable-name->string

>(define myvar 10)
>(variable-name->string myvar)
  "myvar"

但是,我没有成功:string->variable-name

>(define (string->variable-name "myvar2") 4)
    error define: not an identifier, identifier with default, or keyword
    for procedure argument in: "myvar2"

我正在使用 Racket 6.6,linux mint 17.3 64 位。

我的主要目标是如何将字符串转换为变量名称(标识符)。

我想知道:

  1. 读取文本文件;
  2. 从该文本文件中获取变量(字符串)的名称;和
  3. 用于设置具有随机整数的变量名称。define

任何帮助,我将不胜感激。

字符串 变量 动态 球拍 定义

评论

1赞 soegaard 8/17/2016
用于调用名称为 .这意味着您正在定义一个名为的函数,并且由于“myvar2”不是函数参数的合法名称,因此会出现错误。(variable-name->string foo)variable-name->string(define (variable-name->string ...variable-name->string
0赞 Sylwester 8/17/2016
你想用这个做什么?从变量更改为字符串的宏在编译时执行。另一种方式也需要如此,这样你以后就再也无法用它们做任何有用的事情了。
0赞 Alex Correia 8/18/2016
阅读纯文本文件是学术工作的要求。此外,我必须构建一个能够:1-读取纯文本文件的程序;2-从该纯文本文件中提取一些字符串;3- 动态地将该字符串分配给变量名称;4-对该变量进行一些计算;5-最后,将结果写到纯文本文件中。我在所有这些步骤中都取得了成功,但第 3 步除外。
0赞 Nathan majicvr.com 8/15/2018
希望你已经了解了正在发生的事情。@soegaard的回答是正确的;只需在另一个呼叫之前呼叫(define myvar2 1)

答:

0赞 Bohdan Ivanov 8/17/2016 #1

您可以从这里查看答案。

有人建议我不要使用字符串,而是使用标识符。因此,您可以使用另一个带有您想要使用的标识符的 Racket 源,而不是使用纯文本文件,然后导入这个源。

评论

0赞 Alex Correia 8/18/2016
阅读纯文本文件是学术工作的要求。此外,我必须构建一个能够:1-读取纯文本文件的程序;2-从该纯文本文件中提取一些字符串;3- 动态地将该字符串分配给变量名称;4-对该变量进行一些计算;5-最后,将结果写到纯文本文件中。我在所有这些步骤中都取得了成功,但第 3 步除外。
0赞 Alex Correia 8/18/2016
试图提供有关我试图做的事情的更多细节:;字符串“习”是从文本文件中提取的。 ;是不是也一样? ;错误 未定义 习。 ;结果等于 5 吗?(define temp_var "Xi")(define (display temp_var) 2 )(define Xi 2)(display Xi)(+ Xi 3)