在 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"
如果这听起来像是一个新手问题,我很抱歉。我对球拍很陌生。
编辑:
另外,如果只给出 x 和 y[ 的值,我将如何检索这些值? =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
.
导出这些变量
如果我有两个变量,例如
(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"
如果这听起来像是一个新手问题,我很抱歉。我对球拍很陌生。
编辑: 另外,如果只给出 x 和 y[ 的值,我将如何检索这些值? =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
.