基本的にプログラムで識別子を再定義できるようにしたいのですが、他のステートメントで識別子を使用すると、識別子は最新のものにバインドされます。ラケットのモジュールで重複定義を許可するにはどうすればよいですか?
#lang racket
(define x 3)
(write x)
(define x 5)
(write x)
出力35
へ:
は例えば、私はこのような何かをしたいと思います。
基本的にプログラムで識別子を再定義できるようにしたいのですが、他のステートメントで識別子を使用すると、識別子は最新のものにバインドされます。ラケットのモジュールで重複定義を許可するにはどうすればよいですか?
#lang racket
(define x 3)
(write x)
(define x 5)
(write x)
出力35
へ:
は例えば、私はこのような何かをしたいと思います。
これは、あなたがこれを望むためにいくつかの異なる理由があるかもしれないので、答えが難しい質問です。
1)バインディングがバインドされているものを変更できます。
この場合、おそらくset!
に満足していると思います。例:
2)複数のスキーム実装でコードを実行したいとします。
この場合、#lang r5rs
のようなものを使用してください。ラケットは、プログラム可能なプログラミング言語であり、そしてあなたが簡単にあなたが望む意味を持っているラケットの独自のバージョンを作ることができます。
3)あなたはdefine
は、審美的により満足ここset!
答えはもっと複雑であるよりも見つけます。しかし、このスタイルで書かれたコードを読むことは困難であるため、ラケットは意図的にではなく、のセマンティクスを持つように設計されています。大きなファイルと複数の定義を可能にする言語では、読者は誤った定義を見つけやすくなり、それが唯一のものであると仮定します。
これは役に立ちますか?
私はこれを行うための私の推論が何であるかを理解するのに役立つと思います。私はOCamlプログラムをRacketに変換しようとしています。この動作はOCamlで有効なので、Racketでこれを行う簡単な方法も便利です。それは、私はあまりにもユーザーの構文ルール、マクロなどラケットでプログラムする方法に精通していないと言われています。 "識別子がバインドされていない場合は定義してください、そうでなければsetを使用してください!"というキーワードを囲むようなものでしょうか?ラケットで可能でしょうか? – podington
@podingtonこの最近のスレッドで解決策を試してみましょう。https://groups.google.com/forum/#!topic/racket-users/vMvHN-OMv7A – soegaard
それはやったのです。ありがとう! – podington