Most programs I see are text files. If I edit them in an editor, I don't know what data structure represents them, but it might be a doubly linked list of strings, or some other data structure.
If a compiler reads a program, it uses typically a stream of characters.
A string would be something like this: a delimiter, some characters, the delimiter. Example: "a + b". It could also be a string data object in some program.
But programs are not always represented as strings and many are not. Sometimes they are. For example an EVAL procedure may take a string as an argument - then code is represented as a string or passed at runtime as a string object.
When we say in Lisp code is data, we actually mean code is data, but not in the trivial form of text representation formats (text files, strings, ...).
It's an abbreviation. We expect usually not to mention, that it is not of the trivial version. Like when we speak of a picture with lots of color, we don't mention that this excludes pictures with only black, white and shades of grey.
Generally, if I see
a + b
then it says nothing about a data structure and its syntax to represent that. All I know that it must be a syntactical legal expression in some programming language.If I see Lisp code in the form of
(+ a b)
I know that this uses the data syntax for s-expressions to represent that code.I then would require that this is syntactical legal Lisp - THIS requires that in an s-expression, the + operator comes first - that it uses prefix syntax.
Wien we mean code as data, we mean that Lisp uaes an actual and explicit data format to encode its programs: s-expressions. The data format is similar to JSON or XML, in that it has an explicit external representation. It's also similar to JSON, because both have an internal representation in a programming language.
If we would use JSON as a format to encode programs, we would also be able to say, code is data.
S-expressions are slightly more effective as data encoding for programs than JSON, because it uses less delimiters and encodes a rich set of data structures.
So, yes. Code with a non-trivial and simple data-representation makes Lisp cool.