LispWorks constructs strings of a suitable type where sufficient information is available. Failing that, strings are constructed of type according to the value of *default-character-element-type*.
If the value of *default-character-element-type* is base-char then:
(make-string 3)
returns a simple-base-string and:
(coerce sequence 'simple-string)
attempts to construct a simple-base-string. This will signal an error if any element of sequence is not a base-char.
If the value of *default-character-element-type* is cl:character then:
(make-string 3)
returns a simple-text-string and:
(coerce sequence 'simple-string)
attempts to construct a simple-text-string. This will signal an error if any element of sequence is not a cl:character.
Other string constructors also take their default from *default-character-element-type*. For instance, with-output-to-string and make-string-output-stream will construct a stream with element type determined by this variable and generate a string of the same element type.
Also, the string reader will always construct a string of type determined by *default-character-element-type*, unless it sees a character of a larger type, in which case a suitable string is constructed. For example:
CL-USER 1 > (set-default-character-element-type 'character) CHARACTER CL-USER 2 > (type-of "ABC") SIMPLE-TEXT-STRING
Compatibility note: In LispWorks 6.0 and earlier versions, the string reader would not always obey *default-character-element-type*, due to a bug.
The parameter *default-character-element-type* merely provides the default behavior. If enough information is supplied, then a string of suitable type is constructed. For instance, the form:
(make-string 3 :initial-element #\Ideographic-Space)
constructs a string of a type that can hold its elements, regardless of the value of *default-character-element-type*.
Likewise, format nil
, princ-to-string, prin1-to-string and write-to-string will return a string whose element type can hold all characters that are written.
Functions that have a sequence type specifier as an argument, such as concatenate, use it as described in 26.3.5 String types.
The initial value of *default-character-element-type* is base-char, to avoid programs that only require 8-bit strings needlessly creating larger string objects. If your application uses Unicode characters beyond the Latin-1 range (characters of type extended-char) then you should consider which of the following two approaches to use:
(set-default-character-element-type 'cl:character)
Bear in mind that this is a global setting which affects default string construction for the entire system. It could be called from a user interface, depending on whether the user needs to handle characters of type extended-char.
Note: Do not attempt to bind or set directly the variable *default-character-element-type*. Instead, call set-default-character-element-type.
When LispWorks for Windows starts up on a OS with a non-Latin-1 code page, it calls:
(set-default-character-element-type 'cl:character)
so that by default, newly constructed strings can contain the data likely to be returned from the OS or user input.
If you know your string only needs to contain 8-bit data, then you can create it explicitly with element type base-char.
Conversely if you know that a string may need to contain 16-bit data even on a Latin-1 code page system, then you should create it explicitly with element type bmp-char (or cl:character if 32-bit data is needed).
LispWorks® User Guide and Reference Manual - 01 Dec 2021 19:30:24