10 #define NUMBER(X) atom_as_expr(create_number_atom(X))
11 #define STRING(S) atom_as_expr(create_string_atom(S, NULL))
12 #define SYMBOL(S) atom_as_expr(create_symbol_atom(S, NULL))
13 #define CONS(CAR, CDR) cons_as_expr(create_cons(CAR, CDR))
14 #define NIL SYMBOL("nil")
23 // TODO(#285): there is no way to execute struct Expr
33 struct Expr atom_as_expr(struct Atom *atom);
34 struct Expr cons_as_expr(struct Cons *cons);
35 struct Expr void_expr(void);
37 void destroy_expr(struct Expr expr);
38 void print_expr_as_sexpr(struct Expr expr);
52 float num; // ATOM_NUMBER
53 char *sym; // ATOM_SYMBOL
54 char *str; // ATOM_STRING
58 struct Atom *create_number_atom(float num);
59 struct Atom *create_string_atom(const char *str, const char *str_end);
60 struct Atom *create_symbol_atom(const char *sym, const char *sym_end);
61 void destroy_atom(struct Atom *atom);
62 void print_atom_as_sexpr(struct Atom *atom);
70 struct Cons *create_cons(struct Expr car, struct Expr cdr);
71 void destroy_cons(struct Cons *cons);
72 void print_cons_as_sexpr(struct Cons *cons);