9 typedef struct Scope Scope;
14 #define NUMBER(G, X) atom_as_expr(create_number_atom(G, X))
15 #define STRING(G, S) atom_as_expr(create_string_atom(G, S, NULL))
16 #define SYMBOL(G, S) atom_as_expr(create_symbol_atom(G, S, NULL))
17 #define NATIVE(G, F, P) atom_as_expr(create_native_atom(G, F, P))
18 #define CONS(G, CAR, CDR) cons_as_expr(create_cons(G, CAR, CDR))
19 #define NIL(G) SYMBOL(G, "nil")
21 #define CAR(O) ((O).cons->car)
22 #define CDR(O) ((O).cons->cdr)
36 // TODO(#500): Atom type is redundant
41 // Prototype to prevent https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54113
42 const char *expr_type_as_string(enum ExprType expr_type);
44 struct Expr atom_as_expr(struct Atom *atom);
45 struct Expr cons_as_expr(struct Cons *cons);
46 struct Expr void_expr(void);
48 void destroy_expr(struct Expr expr);
49 void print_expr_as_sexpr(FILE *stream, struct Expr expr);
50 int expr_as_sexpr(struct Expr expr, char *output, size_t n);
52 // TODO(#337): EvalResult does not belong to expr unit
60 typedef struct EvalResult (*NativeFunction)(void *param, Gc *gc, struct Scope *scope, struct Expr args);
76 const char *atom_type_as_string(enum AtomType atom_type);
83 // TODO(#330): Atom doesn't support floats
84 long int num; // ATOM_NUMBER
85 char *sym; // ATOM_SYMBOL
86 char *str; // ATOM_STRING
87 struct Native native; // ATOM_NATIVE
91 struct Atom *create_number_atom(Gc *gc, long int num);
92 struct Atom *create_string_atom(Gc *gc, const char *str, const char *str_end);
93 struct Atom *create_symbol_atom(Gc *gc, const char *sym, const char *sym_end);
94 struct Atom *create_native_atom(Gc *gc, NativeFunction fun, void *param);
95 void destroy_atom(struct Atom *atom);
96 void print_atom_as_sexpr(FILE *stream, struct Atom *atom);
104 struct Cons *create_cons(Gc *gc, struct Expr car, struct Expr cdr);
105 void destroy_cons(struct Cons *cons);
106 void print_cons_as_sexpr(FILE *stream, struct Cons *cons);