pprint-pop — 논리 블록에서 요소 하나 꺼내기

pprint-pop — 논리 블록에서 요소 하나 꺼내기

이쁘게 출력하는 코드를 짜다 보면, 논리 블록 안에서 리스트 요소를 하나씩 꺼내 출력하되 print-length이나 print-circle 같은 제약도 함께 처리해야 해요. pprint-pop지역 매크로(Local Macro) 로, 그런 검사를 알아서 하면서 요소를 꺼내 줘요.

출처: PPRINT-POP - Common Lisp HyperSpec

시그니처

pprint-pop <no arguments> => object

본문

인자와 값

  • object어휘적으로 현재인 논리 블록에서 출력 중인 리스트요소 하나, 또는 nil이에요.

설명

어휘적으로 현재인 논리 블록에서 출력 중인 리스트에서 요소 하나를 꺼내고, 아래에서 설명하는 대로 print-lengthprint-circle을 따르면서 돌려줘요.

매크로가 호출될 때마다 어휘적으로 현재인 논리 블록에 넘겨진 리스트에서 다음 값을 꺼내 돌려줘요. 그런데 그 전에 세 가지 검사를 수행해요:

  • 여기서 남은 list리스트가 아니면 . (점과 공백)을 출력한 뒤 남은 list를 출력해요. (이 덕분에 잘못된 인자를 만나도 튼튼한 출력 함수를 쉽게 쓸 수 있어요.)
  • print-lengthnon-nil이고, 바로 감싸는 논리 블록 안에서 매크로가 이미 print-length번 호출되었다면 ...(줄임표)을 출력해요. (print-length를 제대로 처리하는 출력 함수를 쉽게 쓸 수 있게 해주죠.)
  • print-circlenon-nil이고 남은 리스트가 순환(또는 공유) 참조라면 . (점과 공백)을 출력한 뒤 적절한 #``n``# 표식을 출력해요. (리스트에서 cdr 순환과 공유를 잡아내는 용도예요.)

위 세 조건 중 하나라도 발생하면, 표시된 출력이 바로 감싸는 pprint-logical-block이 만든 예쁜 출력 스트림(pretty printing stream) 에 출력되고, 바로 감싸는 pprint-logical-block의 실행은 접미사 출력을 제외하고 종료돼요.

pprint-logical-blocklist 인자로 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 — 논리 블록 시작