Доступ к полям подтипа структуры в схеме и ракетке - PullRequest
5 голосов
/ 24 декабря 2011

В Racket это выдает ошибку:

(struct point-in-plane  (pos_x pos_y))  
(struct pixel point-in-plane (color))  

(define a-pixel (pixel 1 2 "blue"))  
(pixel-color a-pixel)  
(pixel-pos_x a-pixel) 
(pixel-pos_y a-pixel) 

Чтобы это работало, мне нужно заменить две последние строки на:

(point-in-plane-pos_x a-pixel) 
(point-in-plane-pos_y a-pixel) 

Аналогично в R6RS

#!r6rs
(import (rnrs))
(define-record-type point (fields x y))
(define-record-type cpoint (parent point) (fields color))
(define blue-point  (make-cpoint 1 2 "blue"))
(write (cpoint-x blue-point))

выдает похожую ошибку.

По какой причине Scheme (и Racket) не позволяют вам получить доступ к полям подтипа, которые были определены в родительском элементе с помощью: subtypeID-fieldID вместо идентификатора parenttypeID-fieldID

т.е. в моем случае позволяет мне использовать pixel-pos_x и pixel-pos_y.

Ответы [ 2 ]

8 голосов
/ 24 декабря 2011

Одной из причин является то, что struct позволяет вам определять подструктуры с полями с одинаковыми именами.Например:

(struct base (x y))
(struct sub base (x y))

(define rec (sub 1 2 3 4))
(base-x rec) ; => 1
(sub-x rec)  ; => 3

Это потому, что структуры на самом деле не знают об именах полей.Из документации Racket : «Поля структурного типа по существу не названы, хотя имена поддерживаются для сообщений об ошибках»Вы должны запретить это поведение, чтобы получить дополнительные средства доступа для подструктур.

6 голосов
/ 24 декабря 2011

Документация формы struct говорит, что она предоставляет средства доступа и установщики для заданных полей, но не говорит, что она автоматически повторно открывает существующие средства доступа и установщикиродительского типа с дополнительными именами, которые вы ожидаете.

Когда я имею дело со структурами и извлекаю компоненты по имени, я часто использую библиотеку racket / match , особеннос struct * сопоставителем шаблонов.Обычно мне приходится иметь дело с несколькими компонентами структуры, и средство сравнения облегчает это.

...