readin(Words) :-
    get0(Char),
    readin(Char, Words).

% Newlines end the input
readin(10, []) :- !.

% Spaces are ignored
readin(32, Words) :- !,
    get0(Char),
    readin(Char, Words).

% Everything else is collected
readin(Char, [Word|Words]) :-
    readchars(Char, Chars, Next),
    name(Word, Chars),
    readin(Next, Words).

% Space and newline end a word.
readchars(32, [], 32) :- !.
readchars(10, [], 10) :- !.

% All other chars are added to the list.
readchars(Char, [Char|Chars], Last) :-
   get0(Next),
   readchars(Next, Chars, Last).