지연 데이터 구조 계약
지연 데이터 구조 계약 (Lazy Data-structure Contracts)
구조체 필드의 계약(contract)을 지연(lazy) 방식으로 검사하면, 실제로 접근한 필드에 대해서만 계약을 확인할 수 있어 효율적이에요. 이 문서에서는 contract-struct와 define-contract-struct를 통해 지연 구조체 계약을 정의하는 방법을 설명합니다.
출처: Racket Reference
본문
syntax
(contract-struct id (field-id ...))
참고: 이 라이브러리는 더 이상 사용되지 않습니다(deprecated). 대신 struct를 사용하세요. 지연 구조체 계약은 더 이상 별도의 struct 선언을 요구하지 않습니다. 대신 struct/dc와 struct/c가 struct 및 define-struct와 직접 동작해요.
struct와 비슷하지만 두 가지 차이가 있습니다: 필드 뮤테이터(mutator)를 정의하지 않으며, 두 개의 계약 생성자를 정의합니다 — id/c와 id/dc. 첫 번째(id/c)는 필드 수만큼의 인자를 받아서, 그 인자들과 필드가 일치하는 구조체 값에 대한 계약을 반환하는 프로시저예요. 두 번째(id/dc)는 구조체에 대한 계약을 만들어 내는 구문 형태이지만, 뒤쪽 필드의 계약이 앞쪽 필드의 값에 의존할 수 있습니다.
생성된 계약 컴비네이터(combinator)는 지연적(lazy)입니다: 실제로 검사된 데이터 구조의 일부에 대해서만 계약이 성립하는지 확인해요. 더 정확히 말하면, 어떤 선택자(selector)가 구조체의 필드를 추출할 때까지는 지연 데이터 구조 계약이 확인되지 않습니다.
(id/dc field-spec ...)
field-spec = [field-id contract-expr]
| [field-id (field-id ...) contract-expr]
각 field-spec 경우에서, 첫 번째 field-id는 계약이 적용되는 필드를 지정합니다; 필드는 원래 contract-struct와 같은 순서로 지정되어야 해요. 첫 번째 경우는 필드의 계약이 다른 필드의 값에 의존하지 않을 때 사용합니다. 두 번째 경우는 필드의 계약이 다른 어떤 필드에 의존할 때 사용하며, 괄호 안의 field-id들이 그것이 의존하는 필드들을 나타냅니다; 이러한 의존성은 앞쪽 필드에만 가능합니다.
syntax
(define-contract-struct id (field-id ...))
참고: 이 라이브러리는 더 이상 사용되지 않습니다(deprecated). 대신 struct를 사용하세요. 지연 구조체 계약은 더 이상 별도의 struct 선언을 요구하지 않습니다. 대신 struct/dc와 struct/c가 struct 및 define-struct와 직접 동작해요.
contract-struct와 비슷하지만, 생성자의 이름이 make-id가 됩니다. 마치 define-struct처럼요.
더 알아보기
- 구조체 계약 (Contracts for Structs) —
struct/c,struct/dc - 지연 데이터 구조 계약 — The Racket Guide
- 계약 (Contracts) — 계약 관리의 개요