2016-08-20 2 views
1

Я довольно новичок в Racket, и я попытался сделать что-то очень простое на других языках, таких как PHP, который преобразует строку в имя переменной. Что-то вроде:Есть ли простой способ преобразования строк в имена переменных (идентификаторы) в Racket?

#lang racket 
(define t0 3) 
(display t0) ; It outputs 3 
(define (symbol? (string->symbol "t1")) 2) 
(display t1) ; It would output 2, however it throws an error :(

Есть ли способ, чтобы преобразовать строку в идентификатор? Потому что мне нужно динамически определять имена переменных из строк.

+0

Возможного дубликат [Именование переменных, используя переменные в Ракетка ?] (http://stackoverflow.com/questions/29447853/naming-variables-using-variables-in-racket) –

+0

Одним из преимуществ Racket является то, что вы всегда знаете во время компиляции, когда переменная привязана или несвязана. Это означает, что вы не можете создавать новые привязки переменных во время выполнения *, но *, вы можете определить макрос для этого. –

+3

P.S. Похоже, вы думаете о некоторых из тех вещей, которые я делал, прежде чем я знал, что лучше, поэтому я буду предупреждать вас, 'eval' это * не * ответ. Если вы скажете мне, для чего вы хотите это использовать, я могу рассказать вам больше о хороших решениях, включая макросы. –

ответ

1

Действительно soegaard хэш-таблицы являются очень хорошим решением, вот пример:

#lang racket 
(define ht (make-hash)) 
(define sx "x") 
(define sy "y") 
(define sr "r") 
(hash-set! ht sx 2) 
(hash-set! ht sy 3) 
(define r (+ (hash-ref ht sx) (hash-ref ht sy))) ;do calculation (+ 2 3) 
(hash-set! ht sr r) 
(hash-ref ht sr) ; it will output 5 
2

может делать то, что вы хотите, с помощью пространств имен. Однако сначала загляните в хэш-таблицы.

#lang racket 

(define-namespace-anchor here) 
(define ns (namespace-anchor->namespace here)) 

(define foo 42) 
(parameterize ([current-namespace ns]) 
    (namespace-variable-value (string->symbol "foo"))) 

Выход этой программы 42.

+2

Пространства имен приводят к eval, eval приводит к страданиям? –

+1

Eval is evil ... – soegaard

+2

@AlexKnauth Пространства имен приводят к eval, eval ведет на верхний уровень, верхний уровень ведет к безнадежности. ;) –