2

いくつかの機能を構築するとき、私はいくつかの間違いを犯す可能性があります。これが発生したら、[実行] をクリックして、以前のすべての定義と新しい試行を再入力する必要があります。

前のものを「未定義」にしてそのまま続行する方法はあり(define (func args ...) body)ますか?

4

1 に答える 1

4

まず第一に、動作は設計によるものです。モジュールの外で変数を変更することはできません。これにより、オプティマイザーは、とりわけ、さまざまなものをインライン化する機会を得ることができます。詳細 な説明については、http://docs.racket-lang.org/guide/module-set.htmlを参照してください。

モジュール内で何かを変更する必要がある場合、標準的な方法はパラメーターを使用することです。

これは、パラメーターを悪用して再定義を可能にする簡単なハック (つまりハック) です。

関数を再定義可能に宣言するには、 を使用しますredefineable。この例では、関数fooは再定義可能であると宣言されています。

#lang racket

(define-for-syntax (make-current-name stx id)
  (datum->syntax 
   stx (string->symbol
        (format "current-~a" (syntax-e id)))))

(define-syntax (redefine stx)
  (syntax-case stx ()
    [(_ (name arg ...) body ...)
     (with-syntax ([current-name (make-current-name stx #'name)])
       #'(current-name (lambda (arg ...) body ...)))]))

(define-syntax (redefineable stx)
  (syntax-case stx ()
    [(_ name)
     (with-syntax ([current-name (make-current-name stx #'name)])
       #'(begin
           (define current-name (make-parameter (λ x (error 'undefined))))
           (define (name . xs)
             (apply (current-name) xs))))]))

(redefineable foo)

(redefine (foo x) (+ x 1))

プログラムを実行すると、対話ウィンドウで次のように実行できます。

Welcome to DrRacket, version 5.3.0.6--2012-05-11(9401a53/a) [3m].
Language: racket.
> (foo 41)
42
> (redefine (foo x y) (* x y))
> (foo 2 3)
6
于 2012-05-28T19:51:57.597 に答える