如何测试两个结构实例在Racket中是否具有相同的结构类型?

时间:2014-01-29 14:37:52

标签: scheme racket

例如,我有两个结构实例s1s2,但我不知道s1s2的确切类型。是否可以检查s1s2是否具有相同的结构类型?

3 个答案:

答案 0 :(得分:4)

球拍 - #lang racket,主要/完整语言 - type-ofclass-of

相反,你可以使用object-name

#lang racket

(struct s ())
(struct t ())

(define x (s))
(define y (s))
(define z (t))

(object-name x) ; 's
(object-name y) ; 's
(object-name z) ; 't
(equal? (object-name x) (object-name y)) ; #t
(equal? (object-name x) (object-name z)) ; #f

答案 1 :(得分:4)

通常不可能检查该属性,即因为Racket中的结构通常是 opaque ,这意味着反射操作会为您提供有关结构实例的有限信息或无信息。

但是,如果结构类型声明为 transparent ,则可以使用struct-info确定它们是否源自相同的结构类型。

#lang racket

(struct s () #:transparent)
(struct t () #:transparent)

(define-values (s-info _) (struct-info (s)))
(define-values (t-info _) (struct-info (t)))

(equal? s-info t-info)   ; => #f

(define-values (s-info-2 _) (struct-info (s)))

(equal? s-info s-info-2) ; => #t

如果您只想获得此信息的近似值,可以按照Greg的建议并使用object-name。请注意,两个不生成等效实例的结构类型可能具有相同的对象名称:

(define s1 (let () (struct s ()) (s)))
(define s2 (let () (struct s ()) (s)))
(equal? (object-name s1) (object-name s2)) ; => #t

答案 2 :(得分:0)

(原始问题不仅限于球拍)

使用type-of

(eq (type-of s1) (type-of s2))

您也可以使用class-of代替;它对结构无关紧要,但对其他类型无关紧要;你需要仔细考虑你想要做什么。 type-of更精细,但可能无法返回atom,因此您可能无法使用eq

编辑:它似乎也是racket has class-of,所以你可以使用它。