@@ -21,8 +21,9 @@ obj read(void)
21
21
return readp (dfltin ());
22
22
}
23
23
24
- obj read_p (obj args ){
25
- if (is_err (args = chkarity ("read" , 0 , args )))
24
+ obj read_p (obj args )
25
+ {
26
+ if (is_err (args = chkarity ("read" , 0 , args )))
26
27
return args ;
27
28
return read ();
28
29
}
@@ -74,7 +75,7 @@ static obj string(struct token *tkn)
74
75
return of_string (str );
75
76
}
76
77
77
- static obj quote_ (struct inport * port )
78
+ static obj mark_to_list (struct inport * port , obj keyword , char * msg )
78
79
{
79
80
obj dat = readp (port );
80
81
if (is_err (dat ))
@@ -86,14 +87,33 @@ static obj quote_(struct inport *port)
86
87
case TYPE_PAIRPTR :
87
88
case TYPE_STRING :
88
89
case TYPE_SYMBOL :
89
- return list2 (quote , dat );
90
+ return list2 (keyword , dat );
90
91
default :
91
- return error_parser (
92
- AREA , "Expected a datum after quote ', but got \"%s\"" ,
93
- errstr (dat ));
92
+ return error_parser (AREA , msg , errstr (dat ));
94
93
}
95
94
}
96
95
96
+ static obj quote_ (struct inport * port )
97
+ {
98
+ return mark_to_list (
99
+ port , quote ,
100
+ "Expected a datum after \"'\" (quote), but got \"%s\"" );
101
+ }
102
+
103
+ static obj quasiquote_ (struct inport * port )
104
+ {
105
+ return mark_to_list (
106
+ port , quasiquote ,
107
+ "Expected a datum after '`' (quasiquote), but got \"%s\"" );
108
+ }
109
+
110
+ static obj unquote_ (struct inport * port )
111
+ {
112
+ return mark_to_list (
113
+ port , unquote ,
114
+ "Expected a datum after ',' (unquote), but got \"%s\"" );
115
+ }
116
+
97
117
static obj parse_list (obj , struct inport * );
98
118
static obj parse (struct token * tkn , struct inport * port )
99
119
{
@@ -110,6 +130,10 @@ static obj parse(struct token *tkn, struct inport *port)
110
130
return string (tkn );
111
131
case TKN_QUOTE :
112
132
return quote_ (port );
133
+ case TKN_QUASIQUOTE :
134
+ return quasiquote_ (port );
135
+ case TKN_UNQUOTE :
136
+ return unquote_ (port );
113
137
case TKN_EOF :
114
138
return check_eof ();
115
139
default :
0 commit comments