유닛 연결하기와 복합 유닛 만들기
유닛 연결하기와 복합 유닛 만들기
compound-unit은 여러 유닛을 하나의 새로운 복합 유닛으로 묶는 형식이에요. 유닛들을 바로 호출하지 않고, 하나의 단위로 합쳐서 나중에 함께 사용할 수 있게 해줘요.
이 절에서는 compound-unit 형식과 그 동작 방식을 다뤄요.
출처: Racket Reference
본문
syntax compound-unit
(compound-unit
(import link-binding ...)
(export tagged-link-id ...)
(link linkage-decl ...))
`link-binding=`(link-id : tagged-sig-id)````tagged-link-id=`(tag id link-id)``|`link-id`linkage-decl=`((link-binding ...) unit-expr tagged-link-id ...)```
compound-unit은 연결된 유닛들을 즉시 호출하지 않고 여러 유닛을 하나의 새 복합 유닛으로 묶어요. link 절의 unit-expr들이 복합 유닛을 만드는 데 연결될 유닛들을 결정해요. unit-expr들은 compound-unit 형식이 평가될 때 평가돼요.
import 절은 복합 유닛의 임포트를 결정해요. 복합 유닛 바깥에서는 이 임포트들이 일반 유닛과 똑같이 동작하고, 복합 유닛 안에서는 연결된 유닛들 중 일부로 전파돼요. export 절은 복합 유닛의 익스포트를 결정해요. 역시 복합 유닛 바깥에서는 이 익스포트들이 일반 유닛과 동일하게 취급되고, 복합 유닛 안에서는 연결된 유닛들의 익스포트에서 끌어와져요. 마지막으로, link 절의 각 선언의 좌변과 우변은 복합 유닛의 임포트와 익스포트가 연결된 유닛들로 어떻게 전파되는지를 명시해요.
임포트되거나 익스포트된 시그니처의 개별 요소는 복합 유닛 안에서 사용할 수 없어요. 대신 임포트와 익스포트는 시그니처 전체 단위로 연결돼요. 각각의 특정 임포트나 익스포트(즉, 어떤 시그니처의 인스턴스, 태그가 붙을 수도 있어요)에는 link-id 이름이 주어져요. 구체적으로 link-id는 import 절이나 link 절의 선언 좌변에 의해 바인딩돼요. 바인딩된 link-id는 link 절의 선언 우변이나 export 절에서 참조돼요.
link 선언의 좌변은 해당 unit-expr이 만들어내는 유닛의 기대되는 각 익스포트에 이름을 붙여줘요. 실제 유닛은 추가 시그니처를 익스포트할 수 있고, 특정 시그니처 대신 그 시그니처의 확장을 익스포트할 수도 있어요. 유닛이 명시된 시그니처(태그가 있으면 그 태그까지 포함해서)를 익스포트하지 않으면, compound-unit 형식이 평가될 때 exn:fail:contract 예외가 발생해요.
link 선언의 우변은 해당 unit-expr이 만들어내는 유닛에 공급될 임포트를 명시해요. 실제 유닛은 더 적은 시그니처를 임포트할 수 있고, 명시된 시그니처에 의해 확장된 시그니처를 임포트할 수도 있어요. 유닛이 (특정 태그로) 공급된 임포트에 포함되지 않은 시그니처를 임포트하면, compound-unit 형식이 평가될 때 exn:fail:contract 예외가 발생해요. 임포트로 공급되는 각 link-id는 import 절이나 link 절 내의 어떤 선언에서 바인딩되어야 해요.
link 절의 선언 순서는 연결된 유닛들의 호출 순서를 결정해요. 복합 유닛이 호출되면 첫 번째 unit-expr이 만든 유닛이 먼저 호출되고, 그다음 두 번째가 호출되는 식이에요. link 절에 명시된 순서가 실제 유닛들의 init-depend 선언과 일치하지 않으면, compound-unit 형식이 평가될 때 exn:fail:contract 예외가 발생해요.