Попытка применить "дай голову" к пустому списку по идее должна приводить к domain error.
Почему это логично. Лист состоит из объединения типов cons и null. nil - единственный объект типа null. Функции car/cdr работают со списком, соответственно, должны уметь обрабатывать union из двух типов. Если тип cons, то возвращается одно, а если тип null, то возвращается другое. Где тут отсутствует логика?