유닛 호출(Invoking Units)

유닛 호출(Invoking Units)

invoke-unit은 유닛(unit)이 만들어낸 모듈형 컴포넌트를 실제로 실행하는 형태예요. 유닛을 인스턴스화해서 그 본문을 평가한다고 보면 됩니다.

출처: Racket Reference

본문

invoke-unit

syntax

(invoke-unit unit-expr)

(invoke-unit unit-expr (import tagged-sig-spec ...))

unit-expr이 만들어내는 유닛을 호출합니다. 유닛의 각 import에 대해 invoke-unit 표현식은 import 절에 tagged-sig-spec을 담고 있어야 합니다. tagged-sig-spec의 문법은 unit을 참고하세요. 유닛에 import가 없으면 import 절은 생략할 수 있습니다.

tagged-sig-spec이 하나도 제공되지 않으면 unit-expr은 import를 기대하지 않는 유닛을 만들어야 합니다. 유닛을 호출하려면 먼저 모든 바인딩이 #<undefined> 값으로 초기화됩니다. 다음으로 유닛 본문의 정의(definitions)와 표현식들이 순서대로 평가됩니다. 정의의 경우 평가가 해당 변수(들)의 값을 설정합니다. 마지막으로 유닛의 마지막 표현식의 결과가 invoke-unit 표현식의 결과입니다.

제공된 각 tagged-sig-spec은 주변 문맥에서 바인딩을 가져와 호출된 유닛의 import로 바꿉니다. 유닛은 제공된 모든 tagged-sig-spec에 대해 import를 선언할 필요는 없지만, 유닛의 선언된 각 import에 대해 하나의 tagged-sig-spec이 제공되어야 합니다. 제공된 각 tagged-sig-spec 안의 각 변수 식별자에 대해, 주변 문맥에서 그 식별자의 바인딩 값이 호출된 유닛의 해당 import에 사용됩니다.

define-values/invoke-unit

syntax

(define-values/invoke-unit unit-expr
  (import tagged-sig-spec ...)
  (export tagged-sig-spec ...)
  maybe-results-clause)

maybe-results-clause =
  | (values result-id ...)
  | (values result-id ... . rest-results-id)

invoke-unit과 같지만, 유닛의 export 값들이 새 바인딩에 복사됩니다.

unit-expr이 만들어내는 유닛은 invoke-unit의 경우처럼 링크되고 호출됩니다. 게다가 export 절은 지역 정의 문맥으로의 일종의 import로 취급됩니다. 즉, export 절의 tagged-sig-spec을 import로 사용하는 유닛에서 사용할 수 있는 모든 바인딩에 대해, define-values/invoke-unit 폼의 문맥에 대해 정의가 생성됩니다.

maybe-results-clause가 제공되지 않으면 유닛 본문은 임의의 개수의 값을 반환할 수 있고, 모두 무시됩니다. 그 외의 경우 유닛 본문이 반환하는 값들은 주어진 result-id들에 순서대로 바인딩됩니다. rest-results-id가 제공되지 않으면 본문은 result-id의 개수만큼 정확히 값을 반환해야 하지만, 제공되면 본문은 임의로 더 많은 값을 반환할 수 있고, rest-results-id는 추가 결과를 담은 리스트에 바인딩됩니다.

package base의 8.8.0.7 버전에서 변경: maybe-results-clause가 추가되었습니다.

더 알아보기