1#lang racket/base
2(require "config.rkt"
3         "error.rkt"
4         "whitespace.rkt"
5         "location.rkt"
6         "special.rkt"
7         "symbol-or-number.rkt")
8
9(provide read-fixnum
10         read-flonum)
11
12(define (read-fixnum read-one init-c in config)
13  (define c (read-char/skip-whitespace-and-comments init-c read-one in config))
14  (define-values (line col pos) (port-next-location* in c))
15  (define v (read-number-literal c in config "#e"))
16  (cond
17   [(fixnum? v) v]
18   [(eof-object? v) v]
19   [else
20    (reader-error in (reading-at config line col pos)
21                  "expected a fixnum, found ~a"
22                  v)]))
23
24(define (read-flonum read-one init-c in config)
25  (define c (read-char/skip-whitespace-and-comments init-c read-one in config))
26  (define-values (line col pos) (port-next-location* in c))
27  (define v (read-number-literal c in config "#i"))
28  (cond
29   [(flonum? v) v]
30   [(eof-object? v) v]
31   [else
32    (reader-error in (reading-at config line col pos)
33                  "expected a flonum, found ~a"
34                  v)]))
35
36;; ----------------------------------------
37
38(define (read-number-literal c in config mode)
39  (cond
40   [(not (char? c)) c]
41   [else
42    (read-symbol-or-number c in config #:mode mode)]))
43