파일 포함(File Inclusion)

파일 포함(File Inclusion)

include는 다른 파일의 문법을 현재 위치에 그대로 인라인하는 매크로예요. 마치 C 언어의 #include처럼 소스를 복사해서 넣는다고 생각하면 돼요.

출처: Racket Reference

본문

(require racket/include)    ; package: base

이 절에서 문서화하는 바인딩은 racket/base가 아니라 racket/includeracket 라이브러리가 제공합니다.

include

syntax

(include path-spec)

path-spec = string
          | (file string)
          | (lib string ...+)

path-spec이 가리키는 파일 안의 문법을 include 표현식 자리에 인라인합니다.

path-specrequiremod-path 형태 중 일부와 비슷해 보이지만, 그 내용이 모듈일 필요가 없는 파일을 지정합니다. 즉, string은 플랫폼 독립적인 상대 경로로 파일을 가리키고, (file string)은 플랫폼 특화 표기로 파일을 가리키며, (lib string ...)은 컬렉션 안의 파일을 가리킵니다.

path-spec이 상대 경로를 지정한다면, 그 경로는 include 표현식의 소스가 완전한 경로 문자열일 경우 그 소스를 기준으로 해석됩니다. 소스가 완전한 경로 문자열이 아니면, path-spec(current-load-relative-directory)#f가 아닐 때 그것을 기준으로, 그 외에는 (current-directory)를 기준으로 해석됩니다.

포함된 문법은 include 표현식의 어휘적 문맥(lexical context)을 부여받지만, 포함된 문법의 소스 위치(source location)는 실제 소스를 가리킵니다.

include-at/relative-to

syntax

(include-at/relative-to context source path-spec)

include와 같지만, 포함된 문법에는 context의 어휘적 문맥이 사용되고, 상대 path-specsource의 소스를 기준으로 해석됩니다. contextsource 요소는 그 외에는 확장 과정에서 버려집니다.

include/reader

syntax

(include/reader path-spec reader-expr)

include와 같지만, 포함된 파일을 읽는 데 read-syntax 대신 reader-expr 표현식이 만들어내는 프로시저를 사용합니다.

reader-expr는 확장 시점에 transformer 환경에서 평가됩니다. 그것이 read-syntax의 대체물 역할을 하므로, 이 표현식의 값은 두 입력—소스를 나타내는 문자열과 입력 포트—을 소비하고 문법 객체(syntax object)나 eof를 만들어내는 프로시저여야 합니다. 이 프로시저는 eof를 만들어낼 때까지 반복해서 호출됩니다.

이 프로시저가 반환하는 문법 객체는 소스 위치 정보를 가져야 하지만, 보통은 어휘적 문맥이 없습니다. 문법 객체 안의 어휘적 문맥은 무시됩니다.

include-at/relative-to/reader

syntax

(include-at/relative-to/reader context source path-spec reader-expr)

include-at/relative-toinclude/reader를 결합한 형태입니다.

더 알아보기