4

次のようなコードが欲しいです:

(define-struct thing (a b c))
(define th (make-thing 1 2 3))

このようなものを印刷するには:

(make-thing 1 2 3)

DrScheme または MzScheme repl に「th」と入力すると、出力スタイルを「コンストラクター」に設定して、DrScheme で「かなり大きな」言語を使用しています。これは私が DrScheme で得たものです:

(make-thing ...)

(私は文字通り3つのドットを取得します)

MzScheme では:

#<thing>
4

1 に答える 1

7

それにはいくつかの方法があります。最も明白なものは使用することです:

(define-struct thing (a b c) #:transparent)

これにより、出力が行うような低レベルの検査のために構造体にアクセスできるようになります。もう 1 つの方法は、独自のプリンターを使用することです。

(define-struct thing (a b c)
  #:property prop:custom-write
  (lambda (thing port write?)
    (fprintf port (if write? "{~s,~s,~s}" "{~a,~a,~a}")
             (thing-a thing) (thing-b thing) (thing-c thing))))

ただし、「コンストラクター」出力スタイルでは、いくつかのことを別の方法で記述しようとすることに注意してください。また、これらの両方を組み合わせて、独自のライターを持ち、透過的にすることもできます。(透明にするということは、基本的には、任意のコードがインスタンス内のフィールドにアクセスできるようにすることです。thingたとえば、インスタンスequal?を掘り下げることができます。)

最後に、一部の用途では、「プレハブ」構造体を使用する方が適切な機能があります。

(define-struct thing (a b c) #:prefab)

通常define-struct、既に定義されている場合でも、それぞれが新しい型を生成します。しかし、プレハブ構造体を使用すると、既存の型が 1 つあり、この既存の型を操作するためにいくつかの関数 (コンストラクター、述語、およびアクセサー) をバインドしているだけのようになります。

于 2010-02-02T11:51:36.673 に答える