La semplice risposta è che Scheme non è untyped: come hai notato, i programmi Scheme possono usare valori di diversi tipi utili. Tuttavia, le persone significano qualcosa quando dicono che Scheme non è tipizzato, significano qualcosa che è meglio esprimere dicendo che Scheme ha un sistema di tipo dinamico. Lasciatemi (eventualmente) spiegare.
Quando le persone dicono "il calcolo lambda non tipizzato", lo chiamano non tipizzato perché tutti i valori con cui si tratta sono dello stesso tipo: combinatori (potreste averli sentiti chiamati anche "funzioni"). Programmare in un linguaggio del genere è pericoloso perché devi tenere a mente che tipo di cosa volevi rappresentare con ogni valore. Il sistema non ha un aiuto integrato per catturare i tuoi errori.
Le persone di lingue effettivamente programmano tendenzialmente [^ 1] di avere più aiuto a distinguere diversi tipi di valori, questo aiuto extra è nella forma di (1) una raccolta più ricca di tipi per i valori di cui la lingua ti permette di parlare e (2) messaggi di errore che si verificano quando si tenta di applicare un'operazione a un valore di un tipo per il quale l'operazione non è definita.
In alcune implementazioni linguistiche, i programmi possono essere compilati o pre-elaborati in qualche modo prima di essere eseguiti. Se ricevi messaggi di errore sull'utilizzo di valori del tipo sbagliato durante questa fase di compilazione, prima di eseguire il programma, si dice che l'implementazione utilizzi la digitazione statica.
Se (1) non c'è una fase di compilazione o pre-elaborazione o (2) c'è ma si ottengono comunque solo messaggi di errore sull'utilizzo di valori del tipo errato durante l'esecuzione del programma, quindi si dice che l'implementazione usi la dinamica digitazione.
La maggior parte (tutte?) le implementazioni dello schema utilizzano un sistema di battitura dinamico. Ci sono linguaggi abbastanza simili a Scheme che hanno un'implementazione usando la tipizzazione statica, come Racket tipizzato.
[^ 1]: ci sono lingue che le persone hanno effettivamente utilizzato per creare software in cui tutti i valori sono essenzialmente dello stesso tipo, come la maggior parte delle lingue delle macchine native del computer, i linguaggi di assemblaggio e BCPL .