> I may be wrong, but for many types of data, you would not typically use s-expressions - other than as an intermediary representation - your sql is "compiled" to binary datastructures, as are your images - and the machine won't be "running" s-expressions directly either.

S-expressions are both an internal representation and an external textual format. Lists will be parsed into cons cell trees.

See the longer example below. There is nothing which prevents me working with structures/records and arrays as s-expression based text.

There is also nothing which prevents us from providing alternative displays of those, which are not printed as text, but as mixed text and graphics, or graphics only.

In text I would typically give the data symbol names, but in a graphic display I might display them as images.

Symbolics did add a presentation-based user interface for their Lisp Machine operating system with the release of Genera 7.0 in 1987, where the I/O can be done over rich streams and where the system remembers the complete correspondence between graphical display things and the underlying data. Thus the user interacts with various representations (called presentations) of the data. For example, if one has a list of musical notes, you could interact with them as symbolic notes, or as a graphical display of notes.

CL-USER> (defstruct image name bitmap)
IMAGE
CL-USER> (defvar i1 (make-image :name "line1"
:bitmap (let ((a (make-array (list 10 10) :initial-element 0)))
(dotimes (i 10 a)
(setf (aref a i i) 255)))))
I1
CL-USER> (list i1 i1)
(#S(IMAGE :NAME "line1" :BITMAP #2A((255 0 0 0 0 0 0 0 0 0) (0 255 0 0 0 0 0 0 0 0) (0 0 255 0 0 0 0 0 0 0) (0 0 0 255 0 0 0 0 0 0) (0 0 0 0 255 0 0 0 0 0) (0 0 0 0 0 255 0 0 0 0) (0 0 0 0 0 0 255 0 0 0) (0 0 0 0 0 0 0 255 0 0) (0 0 0 0 0 0 0 0 255 0) (0 0 0 0 0 0 0 0 0 255))) #S(IMAGE :NAME "line1" :BITMAP #2A((255 0 0 0 0 0 0 0 0 0) (0 255 0 0 0 0 0 0 0 0) (0 0 255 0 0 0 0 0 0 0) (0 0 0 255 0 0 0 0 0 0) (0 0 0 0 255 0 0 0 0 0) (0 0 0 0 0 255 0 0 0 0) (0 0 0 0 0 0 255 0 0 0) (0 0 0 0 0 0 0 255 0 0) (0 0 0 0 0 0 0 0 255 0) (0 0 0 0 0 0 0 0 0 255))))
CL-USER> (pprint *)

(#S(IMAGE :NAME "line1"
:BITMAP #2A((255 0 0 0 0 0 0 0 0 0)
(0 255 0 0 0 0 0 0 0 0)
(0 0 255 0 0 0 0 0 0 0)
(0 0 0 255 0 0 0 0 0 0)
(0 0 0 0 255 0 0 0 0 0)
(0 0 0 0 0 255 0 0 0 0)
(0 0 0 0 0 0 255 0 0 0)
(0 0 0 0 0 0 0 255 0 0)
(0 0 0 0 0 0 0 0 255 0)
(0 0 0 0 0 0 0 0 0 255)))
#S(IMAGE :NAME "line1"
:BITMAP #2A((255 0 0 0 0 0 0 0 0 0)
(0 255 0 0 0 0 0 0 0 0)
(0 0 255 0 0 0 0 0 0 0)
(0 0 0 255 0 0 0 0 0 0)
(0 0 0 0 255 0 0 0 0 0)
(0 0 0 0 0 255 0 0 0 0)
(0 0 0 0 0 0 255 0 0 0)
(0 0 0 0 0 0 0 255 0 0)
(0 0 0 0 0 0 0 0 255 0)
(0 0 0 0 0 0 0 0 0 255))))
; No value
CL-USER> (let ((i #S(IMAGE :NAME "line1"
:BITMAP #2A((255 0 0 0 0 0 0 0 0 0)
(0 255 0 0 0 0 0 0 0 0)
(0 0 255 0 0 0 0 0 0 0)
(0 0 0 255 0 0 0 0 0 0)
(0 0 0 0 255 0 0 0 0 0)
(0 0 0 0 0 255 0 0 0 0)
(0 0 0 0 0 0 255 0 0 0)
(0 0 0 0 0 0 0 255 0 0)
(0 0 0 0 0 0 0 0 255 0)))))
(setf (aref (image-bitmap i) 2 2) 0)
i)
#S(IMAGE :NAME "line1" :BITMAP #2A((255 0 0 0 0 0 0 0 0 0) (0 255 0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0 0 0) (0 0 0 255 0 0 0 0 0 0) (0 0 0 0 255 0 0 0 0 0) (0 0 0 0 0 255 0 0 0 0) (0 0 0 0 0 0 255 0 0 0) (0 0 0 0 0 0 0 255 0 0) (0 0 0 0 0 0 0 0 255 0)))
CL-USER> (pprint *)

#S(IMAGE :NAME "line1"
:BITMAP #2A((255 0 0 0 0 0 0 0 0 0)
(0 255 0 0 0 0 0 0 0 0)
(0 0 0 0 0 0 0 0 0 0)
(0 0 0 255 0 0 0 0 0 0)
(0 0 0 0 255 0 0 0 0 0)
(0 0 0 0 0 255 0 0 0 0)
(0 0 0 0 0 0 255 0 0 0)
(0 0 0 0 0 0 0 255 0 0)
(0 0 0 0 0 0 0 0 255 0)))
; No value

Typically I would store larger images outside of text files (either in binary Lisp files called fasls or in special image files), but for some purposes it might be okay. For example if my application needs some icons I can store them directly in textual code as s-expressions.

Note also that some Lisp applications use textual s-expressions with serialized data, but those files are not supposed to be edited with a text editor, but with some other tools.

There is also no reason that Lisp could not use Unicode (or other encodings) in s-expressions...