| #pragma once |
| |
| #include "lisp.h" |
| #include <dasm_proto.h> |
| #include <stdbool.h> |
| #include <stdint.h> |
| |
| struct function |
| { |
| char *name; |
| int nargs; // number of arguments |
| |
| union { |
| value_t (*def0) (); |
| value_t (*def1) (value_t); |
| value_t (*def2) (value_t, value_t); |
| value_t (*def3) (value_t, value_t, value_t); |
| void *code_ptr; |
| uintptr_t code_addr; |
| }; |
| |
| struct function *prev; |
| }; |
| |
| struct environment |
| { |
| struct function *first; |
| }; |
| |
| struct variable |
| { |
| char *name; |
| int number; |
| struct variable *prev; |
| }; |
| |
| // local environment |
| struct local |
| { |
| int num_vars; |
| struct variable *first; |
| }; |
| |
| void compile_expression (struct environment *env, struct local *local, |
| value_t val, dasm_State **Dst); |
| void compile_expr_to_func (struct environment *env, char *name, value_t val, |
| dasm_State **Dst); |
| // Compile top-level declaration |
| void compile_tl (value_t val, struct environment *env); |
| struct environment compile_all (struct istream *is); |
| struct function *find_function (struct environment *env, char *name); |