바이트와 문자열 출력

바이트와 문자열 출력 (Byte and String Output)

출력 포트에 문자나 바이트를 쓰는 다양한 함수를 다루는 문서예요. write-char, write-byte, write-string, write-bytes 계열과, 즉시 쓰기(avail) 및 이벤트 기반 쓰기까지 살펴볼게요.

출처: Racket Reference

본문

procedure
(write-char char [out]) → void?
  char : char?
  out : output-port? = (current-output-port)

단일 문자를 out에 씁니다; 더 정확히는 char의 UTF-8 인코딩인 바이트들이 out에 쓰여집니다.

procedure
(write-byte byte [out]) → void?
  byte : byte?
  out : output-port? = (current-output-port)

단일 바이트를 out에 씁니다.

procedure
(newline [out]) → void?
  out : output-port? = (current-output-port)

(write-char #\newline out)과 같습니다.

procedure
(write-string str [out start-pos end-pos]) → exact-nonnegative-integer?
  str : string?
  out : output-port? = (current-output-port)
  start-pos : exact-nonnegative-integer? = 0
  end-pos : exact-nonnegative-integer? = (string-length str)

str에서 인덱스 start-pos(포함)부터 end-pos(제외)까지의 문자를 out에 씁니다. substring처럼, start-posend-posstr의 범위를 벗어나면 exn:fail:contract 예외가 일어납니다.

결과는 out에 쓰인 문자 수이며, 항상 (- end-pos start-pos)입니다.

str이 변경 가능(mutable)하면, write-string이 반환된 후의 변경은 out에 쓰인 문자들에 영향을 주지 않습니다. (이런 변경으로부터의 독립성은 write-string의 특별한 속성이 아니라, 일반적으로 출력 함수들에 적용됩니다.)

procedure
(write-bytes bstr [out start-pos end-pos]) → exact-nonnegative-integer?
  bstr : bytes?
  out : output-port? = (current-output-port)
  start-pos : exact-nonnegative-integer? = 0
  end-pos : exact-nonnegative-integer? = (bytes-length bstr)

write-string과 같지만 문자 대신 바이트를 씁니다.

procedure
(write-bytes-avail bstr [out start-pos end-pos]) → exact-nonnegative-integer?
  bstr : bytes?
  out : output-port? = (current-output-port)
  start-pos : exact-nonnegative-integer? = 0
  end-pos : exact-nonnegative-integer? = (bytes-length bstr)

write-bytes와 같지만, 즉시 flush할 수 있는 만큼의 바이트를 쓴 뒤 블록하지 않고 반환합니다. 즉시 flush할 수 있는 바이트가 없을 때만 블록합니다. 결과는 out에 쓰이고 flush된 바이트 수입니다; start-posend-pos와 같으면 결과는 0일 수 있고(버퍼된 데이터의 성공적인 flush를 나타냄), 그렇지 않으면 결과는 1과 (- end-pos start-pos) 사이입니다(양쪽 포함).

write-bytes-avail 프로시저는 바이트를 절대 버리지 않습니다. write-bytes-avail이 어떤 바이트를 성공적으로 쓴 다음 오류를 만나면, 그 오류를 억제하고 쓰인 바이트 수를 반환합니다. (그 오류는 이후의 쓰기에 의해 트리거됩니다.) 바이트가 하나도 쓰이기 전에 오류를 만나면 예외가 일어납니다.

procedure
(write-bytes-avail* bstr [out start-pos end-pos]) → (or/c exact-nonnegative-integer? #f)
  bstr : bytes?
  out : output-port? = (current-output-port)
  start-pos : exact-nonnegative-integer? = 0
  end-pos : exact-nonnegative-integer? = (bytes-length bstr)

write-bytes-avail과 같지만 절대 블록하지 않으며, 포트에 즉시 쓸 수 없는 버퍼된 데이터가 있으면 #f를, 포트의 내부 버퍼(있다면)는 flush되었지만 추가 바이트를 즉시 쓸 수 없으면 0을 반환합니다.

procedure
(write-bytes-avail/enable-break bstr [out start-pos end-pos]) → exact-nonnegative-integer?
  bstr : bytes?
  out : output-port? = (current-output-port)
  start-pos : exact-nonnegative-integer? = 0
  end-pos : exact-nonnegative-integer? = (bytes-length bstr)

쓰기 동안 브레이크(break)가 활성화된다는 점을 제외하면 write-bytes-avail과 같습니다. 이 프로시저는 쓰기와 브레이크의 상호작용에 대한 보장을 제공합니다: write-bytes-avail/enable-break가 호출될 때 브레이킹이 비활성화되어 있고, 그 호출의 결과로 exn:break 예외가 일어나면, out에 어떤 바이트도 쓰여지지 않았을 것입니다. "Breaks"도 참고하세요.

procedure
(write-special v [out]) → boolean?
  v : any/c
  out : output-port? = (current-output-port)

포트가 특수 쓰기(special write)를 지원하면 vout에 직접 쓰고, 지원하지 않으면 exn:fail:contract을 일으킵니다. 결과는 항상 #t이며, 쓰기가 성공했음을 나타냅니다.

procedure
(write-special-avail* v [out]) → boolean?
  v : any/c
  out : output-port? = (current-output-port)

write-special과 같지만 블록하지 않습니다. v를 즉시 쓸 수 없으면 v를 쓰지 않고 결과는 #f이며, 그렇지 않으면 결과는 #t이고 v가 쓰여집니다.

procedure
(write-bytes-avail-evt bstr [out start-pos end-pos]) → evt?
  bstr : bytes?
  out : output-port? = (current-output-port)
  start-pos : exact-nonnegative-integer? = 0
  end-pos : exact-nonnegative-integer? = (bytes-length bstr)

write-bytes-avail과 비슷하지만, 바이트를 즉시 쓰는 대신 동기화 가능한 이벤트(synchronizable event)를 반환합니다 ("Events" 참고). outport-writes-atomic?이 나타내는 대로 원자적 쓰기(atomic write)를 지원해야 합니다.

이 객체를 동기화하면 bstr에서 쓰기가 시작되고, 바이트가 (버퍼되지 않은 채로) 포트에 쓰여지면 이벤트가 준비됩니다. start-posend-pos가 같으면, 포트의 내부 버퍼(있다면)가 flush될 때 동기화 결과는 0이고, 그렇지 않으면 결과는 양의 정확한 정수입니다. 이벤트가 동기화에서 선택되지 않으면, out에 어떤 바이트도 쓰여지지 않을 것입니다.

procedure
(write-special-evt v [out]) → evt?
  v : any/c
  out : output-port? = (current-output-port)

write-special과 비슷하지만, 특수 값을 즉시 쓰는 대신 동기화 가능한 이벤트를 반환합니다 ("Events" 참고). outport-writes-atomic?이 나타내는 대로 원자적 쓰기를 지원해야 합니다.

이 객체를 동기화하면 특수 값의 쓰기가 시작되고, 그 값이 (버퍼되지 않은 채로) 포트에 쓰여지면 이벤트가 준비됩니다. 이벤트가 동기화에서 선택되지 않으면, out에 어떤 값도 쓰여지지 않을 것입니다.

procedure
(port-writes-atomic? out) → boolean?
  out : output-port?

write-bytes-avail/enable-breakout에 대해 배타적-또는(exclusive-or, 브레이크 또는 쓰기, 둘 다는 아님) 보장을 제공할 수 있고, 포트가 write-bytes-avail-evt 같은 프로시저와 사용될 수 있으면 #t를 반환합니다. Racket의 파일 스트림 포트, 파이프, 문자열 포트, TCP 포트는 모두 원자적 쓰기를 지원합니다. make-output-port로 만들어진 포트("Custom Ports" 참고)는 원자적 쓰기를 지원할 수 있습니다.

procedure
(port-writes-special? out) → boolean?
  out : output-port?

write-special 같은 프로시저가 임의의 값을 포트에 쓸 수 있으면 #t를 반환합니다. Racket의 파일 스트림 포트, 파이프, 문자열 포트, TCP 포트는 모두 특수 값을 거부하지만, make-output-port로 만들어진 포트("Custom Ports" 참고)는 그것들을 지원할 수 있습니다.

더 알아보기