2016-12-24 83 views

回答

1

你不能。你可以得到訪問器,這裏是pt-xpt-y,但是你不能單獨得到xy。爲什麼是這樣?那麼,其中一個原因是,實際上可能有重複。考慮一個方案涉及的一些有害的結構分型:

#lang racket/base 

(struct A [x] #:transparent) 
(struct B A [x] #:transparent) 

現在B類型的結構有兩個x領域,A-xB-x。由於這個原因,當涉及子類型時,任何試圖單獨使用帶有結構的字段名的宏都會被破壞。

什麼你可以做的是使用的訪問者,而不是,您可以通過使用syntax-local-valueextract-struct-info,然後看結果列表的第四個元素實現。然而,老實說,我認爲這是太多的工作,所以我寫了一個語法課來爲你做所有的辛苦工作。安裝syntax-classes包,並使用struct-id語法類:

#lang racket/base 

(require (for-syntax racket/base 
        syntax/parse/class/struct-id) 
     syntax/parse/define) 

(define-simple-macro (struct-accessors id:struct-id) 
    (list id.accessor-id ...)) 

> (struct pt [x y] #:transparent) 
> (struct-accessors pt) 
'(#<procedure:pt-x> #<procedure:pt-y>) 
+0

我想我可以叫'〜在訪問過程了'然後提取該字符串表示字段名,但這似乎極爲不雅。我希望使用結構體字段名稱來提取值以從sxml文檔實例化結構體,但是我開始認爲這不是最好的方式,或者甚至是一種可接受的方式。 – Winny

+1

@Winny'accessor-id'屬性爲您提供了id,因此您可以使用'(map syntax -e(attribute accessor-id))'來獲得一堆符號;不要用'〜a'來表達這種冒險的方式。如果你確保'supertype-id'是'#t',那麼剝離掉一個通用的前綴* *可以用於沒有子類型的結構。 –