I'm not sure whether or to what extent "Vectors work just like lists" is intended to mean "you can mix and match vectors and lists", but the behaviour does look inconsistent. I suggest you report it as a bug, even if just to clarify the documentation.
`(,@[]) ; => [], what?
You're splicing a vector value into an empty list value, and evidentially the vector "wins" that conflict. Note that the fact that it's an empty vector is not relevant -- when you do this, you just get the vector as a result.
`[,@'()] ; => [(\,@ 'nil)], what's this?
The \,@
comes from the output of the lisp reader. backquote.el comments:
When the Lisp reader sees `(...), it generates (\` (...)).
When it sees ,... inside such a backquote form, it generates (\, ...).
For ,@... it generates (\,@ ...).
This is also the case outside of a list:
(read ",@foo")
=> (\,@ foo)
And as you'll know, ()
and nil
are the same thing, hence:
(read "[,@'()]")
=> [(\,@ 'nil)]
The question is therefore "why is the verbatim value from the lisp reader ending up in the vector" and I strongly suspect the answer is simply that vectors are self-quoting, and that it's therefore expected behaviour.
Refer to C-hig (elisp)Vectors
on this point:
A vector, like a string or a number, is considered a constant for
evaluation: the result of evaluating it is the same vector. This does
not evaluate or even examine the elements of the vector. *Note
Self-Evaluating Forms::