Trochu to rozvedu: z pohledu standardu jsou typové deklarace slibem kompilátoru, že dané proměnné (funkce, mezivýsledky, ...) jsou daného typu, a pokud nejsou, jde o nedefinovanou situaci a může se stát cokoliv.
Ty deklarované typy mohou být od "cokoliv" přes "celé číslo" po třeba "buď NIL, nebo pole prvočísel délky 23 a libovolné šířky"; nevím co umožňuje za anotace Python takže neporovnám.
Jak se k tomu staví konkrétní implementace je na ní, a typicky také na hodnotě nastavení optimizací (což jsou taky deklarace). Konkrétně sbcl, pokud si pamatuji, postupuje podle kombinace nastavení deklarovaného safety a speed, a buď kontroluje vše, nebo zjednodušeně (např, deklaraci "celé číslo buď od -17 do -7, nebo od 7 do 17" zjednoduší na běhovou kontrolu "od -17 do 17").
Kromě toho sbcl při kompilaci sleduje typy proměnných v určité míře a varuje pokud něco "nesedí" vzhledem k deklarovaným typům a známým funkcím a operátorům. Ale všechno z té deklarace při kompilaci neověřuje.
Třeba v příkladu nahoře: nepozná jestli do pole ukládáme prvočíslo, ale pokud odvodí že přistupujeme k 24 sloupci pole, tak varuje. A příslušný kód rovnou zkompiluje jako vyvolání chyby INVALID-ARRAY-TYPE-ERROR.