OK, I think I've found the reason: the ']' was not removed from the port, so it caused a read error
> (read-hash-extend #\[ > (let ((process (match-lambda > ((object key) > `(ref ,object ,key)) > (default > default)))) > (lambda (char port) > (let loop ((exp '())) > (let ((char (peek-char port))) > (cond ((char-whitespace? char) > (read-char port) > (loop exp)) > ((eq? char #\]) (read-char port) > (process (reverse exp))) > (#t > (loop (cons (read port) exp))))))))) The question regarding the infix module still remains, though ;]