diff options
author | Marius Vollmer <mvo@zagadka.de> | 2004-10-29 14:45:19 +0000 |
---|---|---|
committer | Marius Vollmer <mvo@zagadka.de> | 2004-10-29 14:45:19 +0000 |
commit | eb42ff2564fdfde5e4dea46acf6f8620e21736cb (patch) | |
tree | f035c816d81cee22b533bb7f0c3eab179f18746a | |
parent | bfad4005d2d85f34d659d919f00b55dd28b3f39d (diff) | |
download | guile-eb42ff2564fdfde5e4dea46acf6f8620e21736cb.tar.gz |
(scm_lreadr): Call scm_i_read_array for all characters followinf '#'
that can start an array. Explicitely disambiguate 'i' and 'e' between
introducing numbers and uniform vectors. Do not call
scm_i_read_homogenous_vector, since that is also handled by
scm_i_read_array now.
-rw-r--r-- | libguile/read.c | 51 |
1 files changed, 33 insertions, 18 deletions
diff --git a/libguile/read.c b/libguile/read.c index 99e9a94b8..f829ea9a8 100644 --- a/libguile/read.c +++ b/libguile/read.c @@ -421,21 +421,48 @@ scm_lreadr (SCM *tok_buf, SCM port, SCM *copy) handle_sharp: switch (c) { + /* Vector, arrays, both uniform and not are handled by this + one function. It also disambiguates between '#f' and + '#f32' and '#f64'. + */ + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case 'u': case 's': case 'f': + case '@': case '(': - p = scm_i_lreadparen (tok_buf, port, s_vector, copy, ')'); - return scm_is_null (p) ? scm_nullvect : scm_vector (p); +#if SCM_ENABLE_DEPRECATED + /* See below for 'i' and 'e'. */ + case 'a': + case 'c': + case 'y': + case 'h': + case 'l': +#endif + return scm_i_read_array (port, c); case 't': case 'T': return SCM_BOOL_T; - case 'f': - /* #f32(...), #f64(...), or just #f. - */ - return scm_i_read_homogenous_vector (port, 'f'); case 'F': + /* See above for lower case 'f'. */ return SCM_BOOL_F; + + case 'i': + case 'e': +#if SCM_ENABLE_DEPRECATED + { + /* When next char is '(', it really is an old-style + uniform array. */ + int next_c = scm_getc (port); + if (next_c != EOF) + scm_ungetc (next_c, port); + if (next_c == '(') + return scm_i_read_array (port, c); + /* Fall through. */ + } +#endif case 'b': case 'B': case 'o': @@ -444,24 +471,12 @@ scm_lreadr (SCM *tok_buf, SCM port, SCM *copy) case 'D': case 'x': case 'X': - case 'i': case 'I': - case 'e': case 'E': scm_ungetc (c, port); c = '#'; goto num; - case 's': - /* #s8(...), #s16(...), #s32(...) or #s64(...) - */ - return scm_i_read_homogenous_vector (port, 's'); - - case 'u': - /* #u8(...), #u16(...), #u32(...) or #u64(...) - */ - return scm_i_read_homogenous_vector (port, 'u'); - case '!': /* should never happen, #!...!# block comments are skipped over in scm_flush_ws. */ |