いくつかの機能を構築するとき、私はいくつかの間違いを犯す可能性があります。これが発生したら、[実行] をクリックして、以前のすべての定義と新しい試行を再入力する必要があります。
前のものを「未定義」にしてそのまま続行する方法はあり(define (func args ...) body)
ますか?
いくつかの機能を構築するとき、私はいくつかの間違いを犯す可能性があります。これが発生したら、[実行] をクリックして、以前のすべての定義と新しい試行を再入力する必要があります。
前のものを「未定義」にしてそのまま続行する方法はあり(define (func args ...) body)
ますか?
まず第一に、動作は設計によるものです。モジュールの外で変数を変更することはできません。これにより、オプティマイザーは、とりわけ、さまざまなものをインライン化する機会を得ることができます。詳細 な説明については、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