私の質問は、hereと尋ねられた質問と同じですが、実際には答えはありません。構造体コンストラクタのオーバーロード?
私は親構造体A
から継承している束の構造体を持っています。この構造体には、すべての子孫に対してオプションとしたい2つのフィールドがあります。以前はを使用していましたが、それはstruct-copy
のようなメソッドを破るために必要なものではなく、オプションで構造体作成時にこれらのフィールドの値をオプションで指定できるようにしたいと考えています。
structのオプションの引数について他にもいくつかの質問がありますが、答えはすべてカスタムコンストラクタを定義して代わりに使用することを示唆しています。残念ながら、私はすでに正規のコンストラクタを使用している多くのコードを持っているので、私が本当に望むのは、このカスタムコンストラクタが構造体自体と同じ名前を持つことです。私がリンクしていた質問に対する答えは、私が探していたものでしたが、残念ながらREPLでは重複する定義が許されているため、REPLでしか動作しません。 REPLの外では、たとえば、(リンクされた質問への答えを実行すると)module: duplicate definition for identifier in: exn:my-app
のようなエラーが出ます。
編集:重複した定義の問題は、struct idがトランスフォーマにもバインドされているためです。私はその定義が起こるのを止めたくありません。私は、コンストラクタとデフォルトのコンストラクタではない構造体のトランスフォーマの両方にバインドされた名前が必要です。
これを行う方法はありますか?既存のコードでうまくいくでしょうか?
はるかに良い解決策! – soegaard
この解決法を少し良くするために、 '(syntax-id-rules(){(args ...)(f arg ...)] [[f])'パターンは['make -variable-like-transformer'](http://docs.racket-lang.org/syntax/transformer-helpers.html#%28def._%28%28lib._syntax%2Ftransformer..rkt%29._make-variable -like-transformers%29%29)関数を使用します。あなたは '(make-variable-like-transformer# 'make-horse)'のように使うことができます。これにより、 'syntax-id-rules'フォームにある' set! 'バグも回避されます。 –
ああ、クール!私はそれを知らなかった。私はそれを追加します。ありがとう! – Anonymous