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.
|
this--necessarily incomplete--list.
|
||||||
|
|
||||||
Sam would like to thank James Bostock, Sven Hartrumpf, Mark Sapa, Phillip
|
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
|
Rulon, Martin Rumori and Sanel Zukan (support for [] delimiters) for their
|
||||||
to Elk 4.0.
|
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 Numeric(t) (t == T_Fixnum || t == T_Flonum || t == T_Bignum)
|
||||||
|
|
||||||
#define Whitespace(c) (c == ' ' || c == '\t' || c == '\014' || c == '\n' || c == '\r')
|
#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 */
|
/* 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 General_Read(), Read_Sequence(), Read_Atom(), Read_Special();
|
||||||
Object Read_String(), Read_Sharp(), Read_True(), Read_False(), Read_Void();
|
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 () {
|
void Init_Read () {
|
||||||
Define_Symbol (&Sym_Quote, "quote");
|
Define_Symbol (&Sym_Quote, "quote");
|
||||||
|
@ -92,7 +92,8 @@ void Init_Read () {
|
||||||
Readers['f'] = Readers['F'] = Read_False;
|
Readers['f'] = Readers['F'] = Read_False;
|
||||||
Readers['v'] = Readers['V'] = Read_Void;
|
Readers['v'] = Readers['V'] = Read_Void;
|
||||||
Readers['!'] = Read_Kludge; /* for interpreter files */
|
Readers['!'] = Read_Kludge; /* for interpreter files */
|
||||||
Readers['('] = Read_Vector;
|
Readers['('] = Read_Vector_Paren;
|
||||||
|
Readers['['] = Read_Vector_Bracket;
|
||||||
Readers['b'] = Readers['B'] =
|
Readers['b'] = Readers['B'] =
|
||||||
Readers['o'] = Readers['O'] =
|
Readers['o'] = Readers['O'] =
|
||||||
Readers['d'] = Readers['D'] =
|
Readers['d'] = Readers['D'] =
|
||||||
|
@ -273,8 +274,8 @@ comment:
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (c == '(') {
|
if (c == '(' || c == '[') {
|
||||||
ret = Read_Sequence (port, 0, konst);
|
ret = Read_Sequence (port, 0, konst, c);
|
||||||
} else if (c == '#') {
|
} else if (c == '#') {
|
||||||
ret = Read_Sharp (port, konst);
|
ret = Read_Sharp (port, konst);
|
||||||
if (TYPE(ret) == T_Special) /* it was a #! */
|
if (TYPE(ret) == T_Special) /* it was a #! */
|
||||||
|
@ -333,11 +334,13 @@ eof:
|
||||||
if (Skip_Comment (port) == EOF)
|
if (Skip_Comment (port) == EOF)
|
||||||
goto eof;
|
goto eof;
|
||||||
goto again;
|
goto again;
|
||||||
|
case ']':
|
||||||
case ')':
|
case ')':
|
||||||
SET(ret, T_Special, c);
|
SET(ret, T_Special, c);
|
||||||
return ret;
|
return ret;
|
||||||
|
case '[':
|
||||||
case '(':
|
case '(':
|
||||||
return Read_Sequence (port, 0, konst);
|
return Read_Sequence (port, 0, konst, c);
|
||||||
case '\'':
|
case '\'':
|
||||||
return READ_QUOTE(Sym_Quote);
|
return READ_QUOTE(Sym_Quote);
|
||||||
case '`':
|
case '`':
|
||||||
|
@ -394,7 +397,7 @@ eof:
|
||||||
/*NOTREACHED*/
|
/*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;
|
Object ret, e, tail, t;
|
||||||
GC_Node3;
|
GC_Node3;
|
||||||
|
|
||||||
|
@ -403,7 +406,14 @@ Object Read_Sequence (Object port, int vec, int konst) {
|
||||||
while (1) {
|
while (1) {
|
||||||
e = Read_Special (port, konst);
|
e = Read_Special (port, konst);
|
||||||
if (TYPE(e) == T_Special) {
|
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;
|
GC_Unlink;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -420,7 +430,7 @@ Object Read_Sequence (Object port, int vec, int konst) {
|
||||||
Cdr (tail) = e;
|
Cdr (tail) = e;
|
||||||
}
|
}
|
||||||
e = Read_Special (port, konst);
|
e = Read_Special (port, konst);
|
||||||
if (TYPE(e) == T_Special && CHAR(e) == ')') {
|
if (TYPE(e) == T_Special && (CHAR(e) == ')' || CHAR(e) == ']')) {
|
||||||
GC_Unlink;
|
GC_Unlink;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -522,8 +532,13 @@ Object Read_Kludge (Object port, int chr, int konst) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*ARGSUSED*/
|
/*ARGSUSED*/
|
||||||
Object Read_Vector (Object port, int chr, int konst) {
|
Object Read_Vector_Paren (Object port, int chr, int konst) {
|
||||||
return List_To_Vector (Read_Sequence (port, 1, konst), 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*/
|
/*ARGSUSED*/
|
||||||
|
|
Loading…
Reference in New Issue