2017-08-11 4 views
1

J'ai un type d'enregistrement point défini comme suit:non-concordance Arity lors de la construction d'un type d'enregistrement des enfants

(define-record-type point 
    (make-point x y) 
    point? 
    (x point-x) 
    (y point-y) 

) 

Maintenant, je veux étendre le type d'enregistrement point et définir un nouveau type d'enregistrement comme suit:

(define-record-type cpoint 
    (make-cpoint color) 
    cpoint? 
    (color cpoint-color) 
    (parent point)  
) 

Lorsque je lance les définitions ci-dessus dans le shell du schéma, tout fonctionne correctement. Je peux construire point types correctement. Cependant, lorsque je tente de construire le type cpoint comme suit:

(define p2 (make-cpoint 8 9 'red)) 

Je reçois l'erreur suivante:

; ...rfi/9/record.rkt:100:28: arity mismatch;; the expected number of arguments does not match the given number; expected: 1; given: 3; [,bt for context]

Je pensais que depuis cpoint est enfant de point, il aurait dû accepter les arguments à la point tapez dans son constructeur.

Comment est-ce que je peux faire ce travail?

P.S Je suis nouveau à Scheme.

Répondre

1

Il n'y a aucun enregistrement enfant dans SRFI-9. Ainsi, vous devez les spécifier indépendamment:

(define-record-type cpoint 
    (make-cpoint x y color) 
    cpoint? 
    (x cpoint-x) 
    (y cpoint-y) 
    (color cpoint-color)) 

Ainsi, les accesseurs pour obtenir x et y pour cpoint et point sont différents.

Alternatives qui a des parents

Dans R6RS vous avez (rnrs records syntactic (6)) qui est similaire à SRFI-9, mais pas compatible. Votre code ressemblerait à ceci:

#!r6rs 

(import (rnrs base) 
     (rnrs records syntactic)) 

(define-record-type (point make-point point?) 
    (fields (immutable x point-x) 
      (immutable y point-y))) 

(define-record-type (cpoint make-cpoint cpoint?) 
    (fields (immutable c cpoint-c)) 
    (parent point)) 


(make-cpoint 4 5 'red) ; ==> implementation chosen visual representation, perhaps #cpoint-4-5-red 

Vous avez marqué Racket et si vous utilisez la langue par défaut, #lang racket, ils ont struct:

#lang racket 

(struct point (x y) #:transparent) 
(struct cpoint point (color) #:transparent) 

(cpoint 4 5 'red) ; ==> (cpoint 4 5 'red) 

j'ajouté #:transparent car il est la valeur par défaut dans R6RS. De vous voulez vraiment que le nom du constructeur soit make-xxx vous devez le spécifier:

#lang racket 

(struct point (x y) 
    #:constructor-name make-point 
    #:transparent) 

(struct cpoint point (color) 
    #:constructor-name make-cpoint 
    #:transparent) 

(make-cpoint 4 5 'red) ; ==> (cpoint 4 5 'red)