pprint-pop — 논리 블록에서 요소 하나 꺼내기
pprint-pop — 논리 블록에서 요소 하나 꺼내기
이쁘게 출력하는 코드를 짜다 보면, 논리 블록 안에서 리스트 요소를 하나씩 꺼내 출력하되 print-length이나 print-circle 같은 제약도 함께 처리해야 해요. pprint-pop은 지역 매크로(Local Macro) 로, 그런 검사를 알아서 하면서 요소를 꺼내 줘요.
시그니처
pprint-pop <no arguments> => object
본문
인자와 값
object— 어휘적으로 현재인 논리 블록에서 출력 중인 리스트의 요소 하나, 또는nil이에요.
설명
어휘적으로 현재인 논리 블록에서 출력 중인 리스트에서 요소 하나를 꺼내고, 아래에서 설명하는 대로 print-length와 print-circle을 따르면서 돌려줘요.
매크로가 호출될 때마다 어휘적으로 현재인 논리 블록에 넘겨진 리스트에서 다음 값을 꺼내 돌려줘요. 그런데 그 전에 세 가지 검사를 수행해요:
- 여기서 남은
list가 리스트가 아니면.(점과 공백)을 출력한 뒤 남은list를 출력해요. (이 덕분에 잘못된 인자를 만나도 튼튼한 출력 함수를 쉽게 쓸 수 있어요.) print-length가 non-nil이고, 바로 감싸는 논리 블록 안에서 매크로가 이미print-length번 호출되었다면...(줄임표)을 출력해요. (print-length를 제대로 처리하는 출력 함수를 쉽게 쓸 수 있게 해주죠.)print-circle가 non-nil이고 남은 리스트가 순환(또는 공유) 참조라면.(점과 공백)을 출력한 뒤 적절한#``n``#표식을 출력해요. (리스트에서 cdr 순환과 공유를 잡아내는 용도예요.)
위 세 조건 중 하나라도 발생하면, 표시된 출력이 바로 감싸는 pprint-logical-block이 만든 예쁜 출력 스트림(pretty printing stream) 에 출력되고, 바로 감싸는 pprint-logical-block의 실행은 접미사 출력을 제외하고 종료돼요.
pprint-logical-block에 list 인자로 nil이 주어진 경우 — 즉 리스트를 처리하지 않는 상황이라면 — pprint-pop은 여전히 print-length 지원을 위해 사용될 수 있어요. 이 상황에서는 첫째·셋째 검사가 비활성화되고 항상 nil을 돌려줘요. Section 22.2.2 (Examples of using the Pretty Printer) — 특히 pprint-vector 예제를 참고하세요.
이 매크로가 전역 환경에서 fbound인지 여부는 구현에 따라 달라요. 재정의와 shadowing 제약은 COMMON-LISP 패키지에 속한 fbound 심볼들과 동일하고, pprint-logical-block 밖에서 사용하면 결과는 정의되지 않아요.
예제
없음.
Side Effects
어휘적으로 현재인 논리 블록과 연관된 예쁜 출력 스트림으로 출력이 발생할 수 있어요.
Affected By
print-length, print-circle.
Exceptional Situations
어휘적으로 감싸는 pprint-logical-block 폼이 없는 곳에서 사용되면 (매크로 확장 시점이든 실행 시점이든) 오류가 신호돼요. 그리고 이 pprint-logical-block의 동적 범위 밖에서 실행되면 결과는 정의되지 않아요.
Notes
pprint-pop을 호출하기 전에 pprint-exit-if-list-exhausted를 먼저 호출하는 것이 좋은 습관이에요.
더 알아보기
pprint-exit-if-list-exhausted— 리스트 소진 검사pprint-logical-block— 논리 블록 시작