如果我有两个变量,例如
(define x 10)
(define y 20)
我想创建一个新变量,使用 x 和 y 的值来创建名字,我该怎么做呢?
例如,让我们说我想创建一个名为 variable-x-y
的新变量(define variable-x-y "some-value")
在这种情况下, x 为10, y 为20。
基本上总结一切,我希望能够输入 变量10-20 并让它返回 " some-值"
对不起,如果这听起来像是一个新手问题。我对Racket来说很陌生。
修改 另外,如果只是给出 x 和 y 的值,我将如何检索这些值?程序)?
例如,让我们说我能够以某种方式定义以下内容:
(define variable-10-20 "some-value")
(define x 10)
(define y 20)
我有没有办法写 variable-xy 并返回 " some-value"
编辑2 以下是我尝试实施的简化代码。它的作用是以递归的方式将每个单独的元素读入一个局部变量,然后可以在它变为"读入"之后使用。我确定如果您使用找到的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)))
答案 0 :(得分:3)
我认为您误解了变量定义的工作原理。当您创建变量名称时,您必须知道如何调用它,您可以动态地define
命名。
也许用于存储绑定的哈希表会很有用,它有点类似于你所要求的并模拟动态定义的变量 - 但我仍然不确定为什么你想要这样做,听起来更像是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"
答案 1 :(得分:1)
与López先生所说的相反,变量名称可以在运行时决定,但仅限于顶级或模块级别。要在模块中执行此操作:
(compile-enforce-module-constants #f)
(eval `(define ,(string->symbol "foo") 'bar) (current-namespace))
这是正确还是错误的做法完全是一个单独的问题。
当您尝试访问这些变量时,您会遇到同样的问题,因此您也必须在那里使用eval
。您无法使用provide
导出这些变量。