0

この関数を「動的定義」と呼びましょう。

基本的に、次のように機能するマクロまたはラムダを書きたいと思います。

$ (dynamic-define "variable" 123)
$ variable
$ => 123

私はそれを試してみました:

(define-syntax dynamic-define
    (syntax-rules ()
      ((_ string <body>)
       (eval `(define ,(string->symbol string) <body>)))))

期待どおりに機能しますが、良い解決策ではないようです。

私はこのようにevalなしで使用しようとしました:

(define-syntax dynamic-define                                           
    (syntax-rules ()                                                            
      ((_ string <body>)                                                        
       (define (string->symbol string) <body>))))

しかし、使用しようとすると、次のエラーが発生します。

Error: invalid syntax (define (string->symbol "variable") 123)

私は何をすべきか?

(お願い: この質問をネイティブの英語に合わせて編集し、この行を消去してください)

4

2 に答える 2

1

使用してdefine-macro

#> (define-macro (dynamic-define varstr val)
      `(define ,(string->symbol varstr) ,val))

#> (dynamic-define "variable" 123)
#> variable
123

使用してsyntax-case

#> (define-syntax dynamic-define
     (lambda (stx)
       (syntax-case stx ()
         ((k varstr val)
          (with-syntax ([var (datum->syntax-object 
                              #'k
                              (string->symbol (syntax-object->datum #'varstr)))])
            #'(define var val))))))

#> (dynamic-define "variable" 123)
#> variable
123
于 2014-04-26T10:33:23.143 に答える