### 14.1 Ports

Scheme uses ports for I/O. A port, which can be treated like any other Scheme object, serves as a source or sink for data. A port must be open before it can be read from or written to. The standard I/O port, `console-i/o-port`, is opened automatically when you start Scheme. When you use a file for input or output, you need to explicitly open and close a port to the file (with procedures described in this chapter). Additional procedures let you open ports to strings.

Many input procedures, such as `read-char` and `read`, read data from the current input port by default, or from a port that you specify. The current input port is initially `console-i/o-port`, but Scheme provides procedures that let you change the current input port to be a file or string.

Similarly, many output procedures, such as `write-char` and `display`, write data to the current output port by default, or to a port that you specify. The current output port is initially `console-i/o-port`, but Scheme provides procedures that let you change the current output port to be a file or string.

Nearly all ports read or write Unicode characters; the exceptions are those for which non-Unicode character coding has been specified.

Every port is either an input port, an output port, or both. The following predicates distinguish all of the possible cases.

procedure: port? object

  Returns `#t` if object is a port, otherwise returns `#f`.

procedure: input-port? object

  Returns `#t` if object is an input port, otherwise returns `#f`. Any object satisfying this predicate also satisfies `port?`.

procedure: output-port? object

  Returns `#t` if object is an output port, otherwise returns `#f`. Any object satisfying this predicate also satisfies `port?`.

procedure: i/o-port? object

  Returns `#t` if object is both an input port and an output port, otherwise returns `#f`. Any object satisfying this predicate also satisfies `port?`, `input-port?`, and `output-port?`.

procedure: guarantee-port object
procedure: guarantee-input-port object
procedure: guarantee-output-port object
procedure: guarantee-i/o-port object

  These procedures check the type of object, signalling an error of type
  `condition-type:wrong-type-argument` if it is not a port, input port, output port, or I/O port, respectively. Otherwise they return object.

The next five procedures return the runtime system’s standard ports. All of the standard ports are dynamically bound by the REP loop; this means that when a new REP loop is started, for example by an error, each of these ports is dynamically bound to the I/O port of the REP loop. When the REP loop exits, the ports revert to their original values.

procedure: current-input-port

  Returns the current input port. This is the default port used by many input procedures. Initially, `current-input-port` returns the value of `console-i/o-port`.

procedure: current-output-port

  Returns the current output port. This is the default port used by many output procedures. Initially, `current-output-port` returns the value of `console-i/o-port`.

procedure: notification-output-port

  Returns an output port suitable for generating “notifications”, that is, messages to the user that supply interesting information about the execution of a program. For example, the `load` procedure writes messages to this port informing the user that a file is being loaded. Initially, `notification-output-port` returns the value of `console-i/o-port`.

procedure: trace-output-port

  Returns an output port suitable for generating “tracing” information about a program’s execution. The output generated by the `trace` procedure is sent to this port. Initially, `trace-output-port` returns the value of `console-i/o-port`.

procedure: interaction-i/o-port

  Returns an I/O port suitable for querying or prompting the user. The standard prompting procedures use this port by default (see Prompting). Initially, `interaction-i/o-port` returns the value of `console-i/o-port`.

procedure: with-input-from-port input-port thunk
procedure: with-output-to-port output-port thunk
procedure: with-notification-output-port output-port thunk
procedure: with-trace-output-port output-port thunk
procedure: with-interaction-i/o-port i/o-port thunk

  Thunk must be a procedure of no arguments. Each of these procedures binds one of the standard ports to its first argument, calls thunk with no arguments, restores the port to its original value, and returns the result that was yielded by thunk. This temporary binding is performed the same way as dynamic binding of a variable, including the behavior in the presence of continuations (see Dynamic Binding).

  `with-input-from-port` binds the current input port, `with-output-to-port` binds the current output port, `with-notification-output-port` binds the “notification” output port, `with-trace-output-port` binds the “trace” output port, and `with-interaction-i/o-port` binds the “interaction” I/O port.

procedure: set-current-input-port! input-port
procedure: set-current-output-port! output-port
procedure: set-notification-output-port! output-port
procedure: set-trace-output-port! output-port
procedure: set-interaction-i/o-port! i/o-port

  Each of these procedures alters the binding of one of the standard ports and returns an unspecified value. The binding that is modified corresponds to the name of the procedure.

variable: console-i/o-port

  `console-i/o-port` is an I/O port that communicates with the “console”. Under unix, the console is the controlling terminal of the Scheme process. Under Windows, the console is the window that is created when Scheme starts up.

  This variable is rarely used; instead programs should use one of the standard ports defined above. This variable should not be modified.

procedure: close-port port

  Closes port and returns an unspecified value. If port is a file port, the file is closed.

procedure: close-input-port port

  Closes port and returns an unspecified value. Port must be an input port or an I/O port; if it is an I/O port, then only the input side of the port is closed.

procedure: close-output-port port

  Closes port and returns an unspecified value. Port must be an output port or an I/O port; if it is an I/O port, then only the output side of the port is closed.