2015-02-04 3 views
2

Я пытаюсь изучить схему (drracket) самостоятельно, и у меня возникла проблема.Схема структуры с другой структурой

Я пытаюсь работать с различными формами, такими как круги, квадраты и прямоугольники. Задача заключается в следующем:.

«Определить типы„круг“,„квадрат“и„прямоугольник“и определить основную типа„форма“ мне нужно-структуру формы для следующей части задания где Я должен определить функцию «область из формы», который получает «форму» databundle и который, как предполагается, представляют область любой заданной формы

Вот то, что я до сих пор:.

(define-struct square (nw lenght)) 

(define-struct circle (center radius)) 

(define-struct rectangle (nw width height)) 

(define-struct shape (...)) 



(define (area-of-shape shapeA) 
    (cond 
    [(square? (shapeA)) (* (square-lenght shapeA) (square-lenght shapeA))] 
    [(circle? (shapeA)) (* 3.14 (* (circle-radius shapeA) (circle-radius shapeA)))] 
    [(rectangle? (shapeA)) (* (rectangle-width shapeA) (rectangle-height shapeA))])) 

Как определить структуру shape? Я пробовал что-то вроде

(define-struct shape (circle square rectangle))

Но это не имеет никакого смысла, поскольку для структуры понадобится все 3 формы.

Любая помощь будет оценена по достоинству.

+0

что вы хотите, что структуру? Если я правильно понимаю. Вы можете передать любую переменную, которую вы определяете как квадратную или прямоугольную функцию. Кроме того, у вас, кажется, есть дополнительный набор parens вокруг вашего аргумента' (shapeA) '. Это должно вызвать ошибку интерпретатора. – Rptx

+0

В основном я хочу, чтобы область формы работала только (!) С фигурами. Не с каким-либо другим номером или чем-то еще. Поэтому я в основном хочу дать «фигуру» в функции, а «форма» должна быть определена как квадрат, круг или прямоугольник. Это упражнение, которое я нашел онлайн без решения. Функциональная область формы не закончена. Я включил его, чтобы показать, что он должен делать. Я могу добавить задачу, чтобы сделать ее более ясной. – ViktorG

+0

Как и в качестве ориентира, структуры '#lang racket' являются основным строительным блоком среды Racket. Создание их первого класса в определении языка - одна из больших вещей, которая делает «ракетку» отличной от схемы R5RS. Масштабы этого решения отражены в их богатстве особенностей и относительно высоком уровне сложности реализации. –

ответ

2

Ракетка могут наследовать Структуры от другой структуры. Итак:

#lang racket 

(struct shape()) 
(struct square shape (nw length)) 
(struct circle shape (center radius)) 
(struct rectangle shape (nw width height)) 

(define (area-of-shape shape) 
    (if (shape? shape) 
    (cond 
     [(square? shape) (* (square-length shape) (square-length shape))] 
     [(circle? shape) (* 3.14 (* (circle-radius shape) (circle-radius shape)))] 
     [(rectangle? shape) (* (rectangle-width shape) (rectangle-height shape))] 
     [else (error 'area-of-shape "Unhandled Shape Condition.")]) 
    (error 'area-of-shape "Argument not a Shape."))) 

;; Example uses 
(area-of-shape (square 0 10)) 
(area-of-shape (circle 0 10)) 
(area-of-shape (rectangle 0 10 10)) 

Кстати, что-то вроде area-of-shape, я считаю, что удобней использовать match чем cond:

(define (area-of-shape shape) 
    (match shape 
    [(square _ len) (* len len)] 
    [(circle _ rad) (* 3.14 (* rad rad))] 
    [(rectangle _ w h) (* w h)])) 
+0

Спасибо большое :) Именно это я и искал. Я еще не видел «матч», но я посмотрю. спасибо mate – ViktorG

+0

Я получаю следующую ошибку: define-struct: ожидалось хотя бы одно имя поля (в скобках) после имени структуры, но найдено что-то другое ", потому что после имени структуры он ожидает paranthesis, но получает" форму " – ViktorG

+0

Notice что я использую 'struct'.' define-struct' - это старая/устаревшая форма. –

1

Я хотел бы сделать это следующим образом:

(define (area-of-shape shapeA) 
    (cond 
    [(square? shapeA) (* (square-lenght shapeA) (square-lenght shapeA))] 
    [(circle? shapeA) (* 3.14 (* (circle-radius shapeA) (circle-radius shapeA)))] 
    [(rectangle? shapeA) (* (rectangle-width shapeA) (rectangle-height shapeA))] 
    [else (error 'area-of-shape "A shape is either a square, a circle, or, a rectangle")])) 
+0

Это была моя идея, но, как сказано, функция области формы должна получить что-то, что является «формой-объектом». Утверждается, что я должен определить структуру структуры. Извините за мой плохой английский – ViktorG

+0

Вы можете просто указать в качестве комментария, что объект формы - это либо квадрат, либо круг, либо прямоугольник. – soegaard

Смежные вопросы