Unit Contracts
Unit Contracts
유닛 계약(unit contract)은 유닛을 감싸서 가져온(import) 식별자와 내보낸(export) 식별자 양쪽이 적절한 계약과 일치하는지 검사해요. 이렇게 하면 프로그래머가 가져온 서명과 내보낸 서명에 계약을 추가하지 않고도 단일 유닛 값에 계약 검사를 추가할 수 있어요.
출처: Racket Reference
본문
(unit/c
(import sig-spec-block ...)
(export sig-spec-block ...)
init-depends-decl
optional-body-ctc)
syntax
sig-spec-block = (tagged-sig-spec [id contract] ...)
| tagged-sig-spec
init-depends-decl =
| (init-depend tagged-sig-id ...)
optional-body-ctc =
| contract
| (values contract ...)
유닛 계약은 유닛을 감싸서 그 가져온 식별자와 내보낸 식별자 모두가 적절한 계약과 일치하는지 검사해요. 이렇게 하면 프로그래머가 가져온 서명과 내보낸 서명에 계약을 추가하지 않고도 단일 유닛 값에 계약 검사를 추가할 수 있죠.
유닛 값은 유닛 계약에 나열된 가져오기 서명들의 부분집합을 가져와야 하고, 내보내기 서명들의 상위집합을 내보내야 해요. 또한 유닛 값은 유닛 계약에 명시된 초기화 의존성의 부분집합인 초기화 의존성을 선언해야 해요. 주어진 서명에 대해 나열되지 않은 어떤 식별자도 그대로 남아요. 주어진 계약 표현식에서 사용된 변수는 먼저 나열된 서명들 중 어느 하나의 다른 변수들을 가리키고, 그다음 unit/c 표현식의 문맥을 가리켜요. 본문 계약이 지정되면 유닛 값을 호출한 결과가 주어진 계약으로 감싸지고, 그렇지 않으면 값들이 그대로 돌려져요.
base 패키지 8.8.0.7 버전에서 변경됨: sig-spec-block이 tagged-sig-id만 허용하는 대신 임의의 tagged-sig-spec을 허용하도록 변경되었어요. 각 계약 표현식의 스코프에서 같은 서명의 바인딩만이 아니라 모든 서명의 바인딩이 보이도록 만들었어요. 또한 서명 바인딩에 대한 계약이 계약 표현식 안에서 강제되도록 했어요.
(define-unit/contract unit-id
(import sig-spec-block ...)
(export sig-spec-block ...)
init-depends-decl
optional-body-ctc
unit-body-expr-or-defn ...)
syntax
optional-body-ctc = | #:invoke/contract contract
| #:invoke/contract (values contract ...)
define-unit/contract 폼은 링크 추론(link inference)과 호환되는 유닛을 정의하며, 그 가져오기와 내보내기가 유닛 계약으로 계약돼요. 유닛 이름은 계약의 긍정 책임(positive blame)에 사용돼요.
base 패키지 8.8.0.7 버전에서 변경됨: 각 계약 표현식의 스코프에서 같은 서명의 바인딩만이 아니라 모든 서명의 바인딩이 보이도록 만들었어요. 또한 서명 바인딩에 대한 계약이 계약 표현식 안에서 강제되도록 했어요.