在 Racket 中使用变量命名变量?

Naming variables using variables in Racket?

如果我有两个变量,例如

(define x 10)
(define y 20)

我想创建一个新变量,使用 x 的值y 来创建名称,我该怎么做呢?

例如,假设我想创建一个名为 variable-x-y

的新变量
(define variable-x-y "some-value")

在这种情况下,x 将是 10 而 y 将是 20。

基本上总结一切,我希望能够输入variable-10-20并拥有它return "some-value"

如果这听起来像是一个新手问题,我很抱歉。我对球拍很陌生。

编辑: 另外,如果只给出 xy[ 的值,我将如何检索这些值? =59=](程序内)?

例如,假设我能够以某种方式定义以下内容:

(define variable-10-20 "some-value")

(define x 10)
(define y 20)

有没有办法让我写 variable-x-y 并返回 "some-value"?

编辑 2 这是我要实现的简化代码。它所做的是递归地将每个单独的元素读入一个局部变量,然后在它全部 "read in" 之后可以使用。我敢肯定,如果您使用找到的方法调整代码 here,它应该可以正常工作。

(define (matrix->variables matrix)
  (local [(define (matrix2->variables/acc matrix2 x y)
            (cond
              [;; the entire matrix has "extracted" it's elements into variables
               (empty? matrix2)
               #|This is where the main program goes for using the variables|#]
              [;; the first row has "extracted" it's elements into variables
               (empty? (first matrix2))
               (matrix2->variables/acc (rest matrix2) 0 (add1 y))]
              [else (local [(define element-x-y "some-value")]
                      ;; Here is where I got stuck since I couldn't find a way to
                      ;; name the variable being created (element-x-y)
                      (matrix2->variables/acc
                       (cons (rest (first matrix2)) (rest matrix2))
                       (add1 x) y))]))]
    (matrix2->variables/acc matrix 0 0)))

我认为您误解了变量定义的工作原理。当你创建一个变量名时,你必须知道如何调用它,你不能define动态命名。

也许用于存储绑定的散列 table 会很有用,它有点类似于您所要求的并模拟具有动态定义的变量 - 但我仍然不确定 为什么 你想这样做,对我来说听起来更像是 XY problem。试试这个:

(define (create-key var1 var2)
  (string->symbol
   (string-append 
    "variable-"
    (number->string var1)
    "-"
    (number->string var2))))

; create a new "variable"
(define x 10)
(define y 20)
(create-key x y)
=> 'variable-10-20

; use a hash for storing "variables"
(define vars (make-hash))

; add a new "variable" to hash
(hash-set! vars (create-key x y) "some-value")

; retrieve the "variable" value from hash
(hash-ref vars 'variable-10-20)
=> "some-value"

与 López 先生所说的相反,变量名称可以在 运行 时决定,但只能在顶层或模块级别。在模块中完成:

(compile-enforce-module-constants #f)
(eval `(define ,(string->symbol "foo") 'bar) (current-namespace))

这是正确还是错误的做法完全是另一个问题。

当您尝试访问这些变量时,您将 运行 遇到同样的问题,因此您也必须在那里使用 eval。您不能使用 provide.

导出这些变量