리더 확장 프로시저

리더 확장 프로시저 (Reader-Extension Procedures)

리더 확장 프로시저는 read, read/recursive, read-syntax 같은 읽기 함수를 통해 호출되어, Racket 리더(reader)가 다루는 입력을 확장해요. 문법 읽기 모드와 일반 읽기 모드에 따라 반환할 값의 형태가 달라져요.

출처: Racket Reference

본문

13.7.2 리더 확장 프로시저

리더 확장 프로시저에 대한 호출은 read, read/recursive, 또는 read-syntax를 통해 촉발될 수 있어요. 또한 특수 읽기(special-read) 프로시저는 read-char-or-special에 대한 호출로, 또는 read-bytes-avail!, peek-bytes-avail!*, read-bytes-avail!, peek-bytes-avail!*의 문맥에 의해 촉발될 수 있어요.

리더 매크로와 특수 결과(special-result) 프로시저의 선택적 인자 개수(arity) 덕분에, read 등을 통한 읽기와 read-syntax 등을 통한 읽기(이때 소스 값은 #f이고 다른 위치 정보는 없음)를 구분할 수 있어요.

문법 읽기 모드(read-syntax 등)에서 리더 확장 프로시저가 호출되면, 일반적으로 어휘 문맥이 없는(예를 들어 첫 번째 인자로 #f를, 세 번째 인자로 주어진 위치 정보를 넘겨 datum->syntax로 만든) 문법 객체를 반환해야 해요. 또 다른 가능한 결과는 특수 주석(special-comment) 값이에요(특수 주석(Special Comments) 참고). 프로시저의 결과가 문법 객체도 아니고 특수 주석 값도 아니라면, datum->syntax로 변환돼요.

비문법 읽기 모드에서 리더 확장 프로시저가 호출되면, 일반적으로 문법 객체를 반환하지 않아야 해요. 만약 문법 객체가 반환되면 syntax->datum으로 일반 값으로 변환돼요.

어느 문맥에서든, 리더 확장 프로시저의 결과가 특수 주석 값이면 read, read-syntax 등은 그 값을 구분 주석으로 취급하고 그 외에는 무시해요.

또한 어느 문맥에서든, 결과는 읽기 결과가 완성되기 전에 벡터나 박스로의 변경(mutation)을 막기 위해 복사될 수 있고, 순환(cycle)이 있는 그래프의 구성을 지원하기 위해 복사될 수 있어요. 가변(mutable) 박스, 벡터, prefab 구조체는, 그런 가변 값으로 이어지는 페어, 박스, 벡터, prefab 구조체, 재귀 읽기(참고 read/recursive)로 만들어진 플레이스홀더(placeholder), 또는 공유 값에 대한 참조와 함께 복사돼요. 복사본에서는 (순환을 포함한) 그래프 구조가 보존돼요.

더 알아보기