2017-08-11 31 views
1

我有一個point記錄類型定義如下時:元數不匹配構建子記錄類型

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

) 

現在,我想擴展point記錄類型,定義了一個新的記錄類型如下:

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

當我在計劃shell中運行上述定義時,一切正常。我可以正確構建point類型。然而,當我嘗試構建cpoint類型如下:

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

我收到以下錯誤:

; ...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]

我因爲cpoint以爲是point孩子,它應該接受的參數爲point在其構造函數中鍵入。

我該如何做這項工作?

P.S我是Scheme的新手。

回答

1

SRFI-9中沒有子記錄。因此,你需要獨立指定它們:

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

這樣的訪問者來獲得xycpointpoint是不同的。有家長

在R6RS

備選項有(rnrs records syntactic (6))這類似於SRFI-9,但不兼容。你的代碼是這樣:

#!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 

您已經標記了球拍,如果你使用的是默認語言,#lang racket,他們有struct

#lang racket 

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

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

我加入#:transparent,因爲它是在R6RS默認。你真的想要構造函數的名稱是make-xxx你需要指定它:

#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)