```
"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.