2014-12-08 54 views
0

我希望爲不同類型的對象創建一個數據結構,這些對象具有不同的訪問相同類型參數的方法。例如,方案/球拍:可擴展功能

一個圓形對象的x-coord前面的組代碼爲10,而一個線條對象的x-coord前面的標題爲30.此外,對象並不總是具有相同的參數

所以泛型函數提取所有必要的參數從任何物體看起來像:

(define (build-struct lst) 
    (if (empty? lst) 
     empty 
     (begin (make-entity (find-params (string=? (car (car lst))))) 
      (build-struct (cdr lst))))) 
    ;function to build structs from a list of lists (that contain an object) 

(define-struct entity (name x-coord y-coord layer-name [num-vertices #:auto] [radius #:auto] [start-angle #:auto] [end-angle #:auto]) 
    #:auto-value empty) 
;data struct to store object param values 

(define (find-circle-param lst parameter) 
    (let ((kw (string-upcase parameter))) 
    (if (empty? lst) 
     '() ;put error message here 
     (cond ((and (string=? kw "X-COORD") (= (car lst) "10")) 
       (cadr lst)) 
       ((and (string=? kw "Y-COORD") (= (car lst) "20")) 
       (cadr lst)) 
       ((and (string=? kw "LAYER-NAME") (= (car lst) "8")) 
       (cadr lst)) 
       ((and (string=? kw "RADIUS") (= (car lst) "40")) 
       (cadr lst)) 
       (else #f))))) 
(define (find-line-param lst parameter) 
    (let ((kw (string-upcase parameter))) 
    (if (empty? lst) 
     '() ;put error message here 
     (cond ((and (string=? kw "X-COORD-START") (= (car lst) "10")) 
       (cadr lst)) 
       ((and (string=? kw "Y-COORD-START") (= (car lst) "20")) 
       (cadr lst)) 
       ((and (string=? kw "X-COORD-END") (= (car lst) "11")) 
       (cadr lst)) 
       ((and (string=? kw "Y-COORD-END") (= (car lst) "21")) 
       (cadr lst)) 
       ((and (string=? kw "LAYER-NAME") (= (car lst) "8")) 
       (cadr lst)) 
       (else #f))))) 
;functions to find parameter value depending on object type 

我只是想尋找參數來創建一個功能。

+0

我錯過了一些上下文。你正在實現你自己的對象系統嗎? – soegaard 2014-12-08 11:26:05

+0

不,我只是想減少重複 – KRC 2014-12-08 12:43:58

回答

1

結構可以有一個超級類型。如果你有幾個具有共同屬性的結構,考慮給它們一個通用的超類型。這裏有一個例子:

#lang racket 
(struct shape  (x y)   #:transparent) ; all shapes has x and y coordinates 
(struct circle shape (radius)  #:transparent) ; a circle has besides the center also a radius 
(struct line shape (x-end y-end) #:transparent) ; a line has besides its start point also end coords  
(define c (circle 1 2 3)) 
(define l (line 4 5 6 7)) 

(define (position a-shape) 
    (match a-shape 
    [(shape x y) (list "Position:" x y)] 
    [_   (error 'position "expected a shape, got ~a" a-shape)])) 

(position c) 
(position l) 

注意位置的定義可以找到既圓和線的位置,沒有位置的定義圓和線的明確提及。

+0

你可以把這個例子擴展成一個我可以運行的小型獨立程序嗎?我不確定a形狀是從哪裏來的。 – KRC 2014-12-09 01:36:59

+1

a形狀只是名稱的一部分。該片段是一個完整的程序。 – soegaard 2014-12-09 06:12:49

+0

我得到的錯誤 - >圈:模塊中的unbound標識符:圓:( – KRC 2014-12-09 07:16:58