지연 데이터 구조 계약

지연 데이터 구조 계약 (Lazy Data-structure Contracts)

구조체 필드의 계약(contract)을 지연(lazy) 방식으로 검사하면, 실제로 접근한 필드에 대해서만 계약을 확인할 수 있어 효율적이에요. 이 문서에서는 contract-structdefine-contract-struct를 통해 지연 구조체 계약을 정의하는 방법을 설명합니다.

출처: Racket Reference

본문

syntax
(contract-struct id (field-id ...))

참고: 이 라이브러리는 더 이상 사용되지 않습니다(deprecated). 대신 struct를 사용하세요. 지연 구조체 계약은 더 이상 별도의 struct 선언을 요구하지 않습니다. 대신 struct/dcstruct/cstructdefine-struct와 직접 동작해요.

struct와 비슷하지만 두 가지 차이가 있습니다: 필드 뮤테이터(mutator)를 정의하지 않으며, 두 개의 계약 생성자를 정의합니다 — id/cid/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/dcstruct/cstructdefine-struct와 직접 동작해요.

contract-struct와 비슷하지만, 생성자의 이름이 make-id가 됩니다. 마치 define-struct처럼요.

더 알아보기