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

时间:2015-04-04 14:58:24

标签: scheme racket variable-assignment

如果我有两个变量,例如

(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)))

2 个答案:

答案 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导出这些变量。