#include "ao_lisp.h"
#include "ao_lisp_read.h"
#include <math.h>
+#include <stdlib.h>
static const uint16_t lex_classes[128] = {
IGNORE, /* ^@ */
PRINTABLE|SPECIAL, /* ) */
PRINTABLE, /* * */
PRINTABLE|SIGN, /* + */
- PRINTABLE, /* , */
+ PRINTABLE|SPECIAL, /* , */
PRINTABLE|SIGN, /* - */
PRINTABLE|DOTC|FLOATC, /* . */
PRINTABLE, /* / */
PRINTABLE, /* ] */
PRINTABLE, /* ^ */
PRINTABLE, /* _ */
- PRINTABLE, /* ` */
+ PRINTABLE|SPECIAL, /* ` */
PRINTABLE, /* a */
PRINTABLE, /* b */
PRINTABLE, /* c */
return QUOTE;
case '.':
return DOT;
+ case '`':
+ return QUASIQUOTE;
+ case ',':
+ c = lexc();
+ if (c == '@') {
+ add_token(c);
+ end_token();
+ return UNQUOTE_SPLICING;
+ } else {
+ lex_unget(c);
+ return UNQUOTE;
+ }
}
}
if (lex_class & POUND) {
return NUM;
}
if (isfloat && hasdigit) {
- token_float = atof(token_string);
+ token_float = strtof(token_string, NULL);
return FLOAT;
}
for (u = 0; u < NUM_NAMED_FLOATS; u++)
static inline int lex(void)
{
int parse_token = _lex();
- DBGI("token %d (%s)\n", parse_token, token_string);
+ RDBGI("token %d (%s)\n", parse_token, token_string);
return parse_token;
}
static int
push_read_stack(int cons, int read_state)
{
- DBGI("push read stack %p 0x%x\n", ao_lisp_read_cons, read_state);
- DBG_IN();
+ RDBGI("push read stack %p 0x%x\n", ao_lisp_read_cons, read_state);
+ RDBG_IN();
if (cons) {
ao_lisp_read_stack = ao_lisp_cons_cons(ao_lisp_cons_poly(ao_lisp_read_cons),
ao_lisp__cons(ao_lisp_int_poly(read_state),
ao_lisp_read_cons_tail = 0;
ao_lisp_read_stack = 0;
}
- DBG_OUT();
- DBGI("pop read stack %p %d\n", ao_lisp_read_cons, read_state);
+ RDBG_OUT();
+ RDBGI("pop read stack %p %d\n", ao_lisp_read_cons, read_state);
return read_state;
}
char *string;
int cons;
int read_state;
- ao_poly v;
-
+ ao_poly v = AO_LISP_NIL;
cons = 0;
read_state = 0;
v = AO_LISP_NIL;
break;
case QUOTE:
+ case QUASIQUOTE:
+ case UNQUOTE:
+ case UNQUOTE_SPLICING:
if (!push_read_stack(cons, read_state))
return AO_LISP_NIL;
cons++;
read_state = READ_IN_QUOTE;
- v = _ao_lisp_atom_quote;
+ switch (parse_token) {
+ case QUOTE:
+ v = _ao_lisp_atom_quote;
+ break;
+ case QUASIQUOTE:
+ v = _ao_lisp_atom_quasiquote;
+ break;
+ case UNQUOTE:
+ v = _ao_lisp_atom_unquote;
+ break;
+ case UNQUOTE_SPLICING:
+ v = _ao_lisp_atom_unquote2dsplicing;
+ break;
+ }
break;
case CLOSE:
if (!cons) {