"In ISLisp, language specifications are separated from processor specifications. ISLisp forms after macro expansion and other pre-processing are called "prepared form" and ISLisp does not define preparation procedures."
The text you're quoting implies the language has a macro expander. There are arrays and vectors, so you could implement hashmaps, and I think some of the implementations of the language already does.
That exact text is not found in the spec; it's from the ISLisp page. ISLisp does have the concept of "prepared form" it refers to, but you have to look at the spec to understand what that means.
It looks to me that this "prepared form" is the same as in other traditional Lisps: that the source code of the program is defined in terms of nested lists, but may undergo a transformation into an undocumented form (for instance ARM machine language) in preparation for execution. E.g. in Steel Bank Common Lisp, everything you type into the REPL is first transformed into machine code and then run. Common Lisp doesn't define the details of such a thing, but does have a lot to say about compilation.
The actual ISLisp says:
An object is prepared for execution; this might include transformation or compilation,
including macro expansion. The method of preparation for execution and its result are not
defined in this document (with exception of the violations to be detected). After successful
preparation for execution the result is ready for execution.
Obviously, the macro expansion parts are defined at least to some extent because it interacts with user macro definitions. (Perhaps even when it comes to macro expansion, ISLisp doesn't nail down the exact semantics, like when exactly is it done. It's possible for a pure Lisp interpreter to work with unexpanded code and continuously re-expand any macro call that it encounters, in the latest dynamic environment. That allows for macros to be fixed on-the-fly.)
Good joke.