Parse unquote / unquote-splicing

This commit is contained in:
Justin Ethier 2017-08-14 21:31:31 +00:00
parent eb57300bdd
commit e99bc4c044
2 changed files with 24 additions and 4 deletions

View file

@ -747,9 +747,10 @@
(list 'quote (parse2 fp))) (list 'quote (parse2 fp)))
((eq? token #\`) ((eq? token #\`)
(list 'quasiquote (parse2 fp))) (list 'quasiquote (parse2 fp)))
;; TODO: , - tricky, could be unquote or unquote-splicing ((eq? token #\,)
;;((eq? t #\`) (list 'unquote (parse2 fp)))
;; (list 'quasiquote (parse2 fp))) ((eq? token (string->symbol ",@"))
(list 'unquote-splicing (parse2 fp)))
;; Other special cases? ;; Other special cases?
(else (else
token)))) token))))

View file

@ -5858,6 +5858,14 @@ void _read_return_atom(void *data, object cont, port_type *p)
} }
} }
#define _read_next_char(data, cont, p) \
if (p->mem_buf_len == 0 || p->mem_buf_len == p->buf_idx) { \
int rv = read_from_port(p); \
if (!rv) { \
return_closcall1(data, cont, Cyc_EOF); \
} \
}
void Cyc_io_read_token(void *data, object cont, object port) void Cyc_io_read_token(void *data, object cont, object port)
{ {
Cyc_check_port(data, port); Cyc_check_port(data, port);
@ -5890,10 +5898,21 @@ void Cyc_io_read_token(void *data, object cont, object port)
} else if (isspace(c)) { } else if (isspace(c)) {
if (p->tok_end) _read_return_atom(data, cont, p); if (p->tok_end) _read_return_atom(data, cont, p);
_read_whitespace(p); _read_whitespace(p);
} else if (c == '(' || c == ')' || c == '\'' || c == '`' || c == ',') { } else if (c == '(' || c == ')' || c == '\'' || c == '`') {
if (p->tok_end) _read_return_atom(data, cont, p); if (p->tok_end) _read_return_atom(data, cont, p);
return_closcall1(data, cont, obj_char2obj(c)); return_closcall1(data, cont, obj_char2obj(c));
} else if (c == ',') {
if (p->tok_end) _read_return_atom(data, cont, p);
_read_next_char(data, cont, p); // Do another buffer read if needed
if (p->mem_buf[p->buf_idx] == '@') {
object unquote_splicing = find_or_add_symbol(",@");
p->buf_idx++;
p->col_num++;
return_closcall1(data, cont, unquote_splicing);
} else {
return_closcall1(data, cont, obj_char2obj(c));
}
} else if (c == '"') { } else if (c == '"') {
if (p->tok_end) _read_return_atom(data, cont, p); if (p->tok_end) _read_return_atom(data, cont, p);
_read_string(data, cont, p); _read_string(data, cont, p);