```
"hello!"
(adjust-array "" 3
:displaced-to *
:displaced-index-offset 3)
"hello!"
(1- (length *))
(With-output-to-string (*standard-output*)
(loop :for x :downfrom *
:to 0 :by 2
:do
(princ (elt ** x))))
```
Lisp strings are basically simple-vectors of characters, so they are just like the vectors above. Repl for those not playing along:
```
CL-USER> "hello!"
"hello!"
CL-USER> (adjust-array "" 3
:displaced-to *
:displaced-index-offset 3)
"lo!"
CL-USER>
; No value
CL-USER> "hello!"
"hello!"
CL-USER> (1- (length *))
5
CL-USER> (With-output-to-string (*standard-output*)
(loop :for x :downfrom *
:to 0 :by 2
:do
(princ (elt ** x))))
"!le"
CL-USER>
```
while indexing and subsequencing a string are just the vector above again, indexing with a custom, maybe negative ("from end") step in python like `>>> "hello!"[6:0:-2]` ⮕ `'!le'` are written explicitly in ansi common lisp's `loop` facility domain specific language (or `do`).
Except for the explicit `loop` above, in ansi cl no iteration per se is being used, so it does not really make sense to supply an iterative step. Then, outputting to a string, or vector, or into an existing array, or letting loop collect and split lists like it wants to all seem too different to put in one bag together.