mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-08 13:37:33 +02:00
Faster parsing of numbers
This commit is contained in:
parent
c7b395506b
commit
d471813a37
2 changed files with 12 additions and 8 deletions
|
@ -6137,13 +6137,9 @@ void _read_return_atom(void *data, object cont, port_type *p)
|
|||
p->tok_end = 0; // Reset for next atom
|
||||
|
||||
if (_read_is_numeric(p->tok_buf)) {
|
||||
make_empty_vector(vec);
|
||||
make_string(str, p->tok_buf);
|
||||
vec.num_elements = 2;
|
||||
vec.elements = (object *) alloca(sizeof(object) * vec.num_elements);
|
||||
vec.elements[0] = &str;
|
||||
vec.elements[1] = obj_int2obj(10);
|
||||
return_thread_runnable(data, &vec);
|
||||
make_c_opaque(opq, &str);
|
||||
return_thread_runnable(data, &opq);
|
||||
} else if (strncmp("+inf.0", p->tok_buf, 6) == 0 ||
|
||||
strncmp("-inf.0", p->tok_buf, 6) == 0) {
|
||||
make_double(d, pow(2.0, 1000000));
|
||||
|
|
|
@ -103,12 +103,22 @@
|
|||
"(void *data, int argc, closure _, object k, object opq, object obj)"
|
||||
" return_closcall1(data, k, equalp( opaque_ptr(opq), obj ));")
|
||||
|
||||
(define-c Cyc-opaque-unsafe-string?
|
||||
"(void *data, int argc, closure _, object k, object opq)"
|
||||
" return_closcall1(data, k, Cyc_is_string(opaque_ptr(opq)));")
|
||||
|
||||
(define-c Cyc-opaque-unsafe-string->number
|
||||
"(void *data, int argc, closure _, object k, object opq)"
|
||||
" Cyc_string2number_(data, k, opaque_ptr(opq));")
|
||||
|
||||
(define (parse fp)
|
||||
(let ((token (read-token fp)))
|
||||
;(write `(token ,token))
|
||||
(cond
|
||||
((Cyc-opaque? token)
|
||||
(cond
|
||||
((Cyc-opaque-unsafe-string? token)
|
||||
(Cyc-opaque-unsafe-string->number token))
|
||||
;; Open paren, start read loop
|
||||
((Cyc-opaque-unsafe-eq? token #\()
|
||||
(let loop ((lis '())
|
||||
|
@ -133,8 +143,6 @@
|
|||
token))) ;; error if this is returned to original caller of parse
|
||||
((vector? token)
|
||||
(cond
|
||||
((= (vector-length token) 2) ;; Special case: number
|
||||
(string->number (vector-ref token 0) (vector-ref token 1)))
|
||||
((= (vector-length token) 3) ;; Special case: exact/inexact number
|
||||
(if (vector-ref token 2)
|
||||
(exact (string->number (vector-ref token 0) (vector-ref token 1)))
|
||||
|
|
Loading…
Add table
Reference in a new issue