Support for [] delimiters in addition to (), courtesy of Sanel Zukan.
git-svn-id: svn://svn.zoy.org/elk/trunk@279 55e467fa-43c5-0310-a8a2-de718669efc6
This commit is contained in:
parent
cb4532eb43
commit
247a29cb18
4
AUTHORS
4
AUTHORS
|
@ -30,6 +30,6 @@ Scott Watson, and Mike Wray. Oliver apologizes for any omissions from
|
|||
this--necessarily incomplete--list.
|
||||
|
||||
Sam would like to thank James Bostock, Sven Hartrumpf, Mark Sapa, Phillip
|
||||
Rulon and Martin Rumori for their useful bug reports and patches on the road
|
||||
to Elk 4.0.
|
||||
Rulon, Martin Rumori and Sanel Zukan (support for [] delimiters) for their
|
||||
useful bug reports and patches on the road to Elk 4.0.
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ extern_c Object elk_import False2;
|
|||
#define Numeric(t) (t == T_Fixnum || t == T_Flonum || t == T_Bignum)
|
||||
|
||||
#define Whitespace(c) (c == ' ' || c == '\t' || c == '\014' || c == '\n' || c == '\r')
|
||||
#define Delimiter(c) (c == ';' || c == ')' || c == '(' || c == '"')
|
||||
#define Delimiter(c) (c == ';' || c == ')' || c == '(' || c == '[' || c == ']' || c == '"')
|
||||
|
||||
|
||||
/* Align heap addresses */
|
||||
|
|
35
src/read.c
35
src/read.c
|
@ -80,7 +80,7 @@ static void Read_Grow () {
|
|||
|
||||
Object General_Read(), Read_Sequence(), Read_Atom(), Read_Special();
|
||||
Object Read_String(), Read_Sharp(), Read_True(), Read_False(), Read_Void();
|
||||
Object Read_Kludge(), Read_Vector(), Read_Radix(), Read_Char();
|
||||
Object Read_Kludge(), Read_Vector_Paren(), Read_Vector_Bracket(), Read_Radix(), Read_Char();
|
||||
|
||||
void Init_Read () {
|
||||
Define_Symbol (&Sym_Quote, "quote");
|
||||
|
@ -92,7 +92,8 @@ void Init_Read () {
|
|||
Readers['f'] = Readers['F'] = Read_False;
|
||||
Readers['v'] = Readers['V'] = Read_Void;
|
||||
Readers['!'] = Read_Kludge; /* for interpreter files */
|
||||
Readers['('] = Read_Vector;
|
||||
Readers['('] = Read_Vector_Paren;
|
||||
Readers['['] = Read_Vector_Bracket;
|
||||
Readers['b'] = Readers['B'] =
|
||||
Readers['o'] = Readers['O'] =
|
||||
Readers['d'] = Readers['D'] =
|
||||
|
@ -273,8 +274,8 @@ comment:
|
|||
}
|
||||
continue;
|
||||
}
|
||||
if (c == '(') {
|
||||
ret = Read_Sequence (port, 0, konst);
|
||||
if (c == '(' || c == '[') {
|
||||
ret = Read_Sequence (port, 0, konst, c);
|
||||
} else if (c == '#') {
|
||||
ret = Read_Sharp (port, konst);
|
||||
if (TYPE(ret) == T_Special) /* it was a #! */
|
||||
|
@ -333,11 +334,13 @@ eof:
|
|||
if (Skip_Comment (port) == EOF)
|
||||
goto eof;
|
||||
goto again;
|
||||
case ']':
|
||||
case ')':
|
||||
SET(ret, T_Special, c);
|
||||
return ret;
|
||||
case '[':
|
||||
case '(':
|
||||
return Read_Sequence (port, 0, konst);
|
||||
return Read_Sequence (port, 0, konst, c);
|
||||
case '\'':
|
||||
return READ_QUOTE(Sym_Quote);
|
||||
case '`':
|
||||
|
@ -394,7 +397,7 @@ eof:
|
|||
/*NOTREACHED*/
|
||||
}
|
||||
|
||||
Object Read_Sequence (Object port, int vec, int konst) {
|
||||
Object Read_Sequence (Object port, int vec, int konst, int start_chr) {
|
||||
Object ret, e, tail, t;
|
||||
GC_Node3;
|
||||
|
||||
|
@ -403,7 +406,14 @@ Object Read_Sequence (Object port, int vec, int konst) {
|
|||
while (1) {
|
||||
e = Read_Special (port, konst);
|
||||
if (TYPE(e) == T_Special) {
|
||||
if (CHAR(e) == ')') {
|
||||
if (CHAR(e) == ')' || CHAR(e) == ']') {
|
||||
if ((start_chr == '(' && CHAR(e) == ']')
|
||||
|| (start_chr == '[' && CHAR(e) == ')')) {
|
||||
char buf[64];
|
||||
sprintf(buf, "expression starts with '%c' but ends "
|
||||
"with '%c'", start_chr, CHAR(e));
|
||||
Reader_Error (port, buf);
|
||||
}
|
||||
GC_Unlink;
|
||||
return ret;
|
||||
}
|
||||
|
@ -420,7 +430,7 @@ Object Read_Sequence (Object port, int vec, int konst) {
|
|||
Cdr (tail) = e;
|
||||
}
|
||||
e = Read_Special (port, konst);
|
||||
if (TYPE(e) == T_Special && CHAR(e) == ')') {
|
||||
if (TYPE(e) == T_Special && (CHAR(e) == ')' || CHAR(e) == ']')) {
|
||||
GC_Unlink;
|
||||
return ret;
|
||||
}
|
||||
|
@ -522,8 +532,13 @@ Object Read_Kludge (Object port, int chr, int konst) {
|
|||
}
|
||||
|
||||
/*ARGSUSED*/
|
||||
Object Read_Vector (Object port, int chr, int konst) {
|
||||
return List_To_Vector (Read_Sequence (port, 1, konst), konst);
|
||||
Object Read_Vector_Paren (Object port, int chr, int konst) {
|
||||
return List_To_Vector (Read_Sequence (port, 1, konst, '('), konst);
|
||||
}
|
||||
|
||||
/*ARGSUSED*/
|
||||
Object Read_Vector_Bracket (Object port, int chr, int konst) {
|
||||
return List_To_Vector (Read_Sequence (port, 1, konst, '['), konst);
|
||||
}
|
||||
|
||||
/*ARGSUSED*/
|
||||
|
|
Loading…
Reference in New Issue