mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			103 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef BOOTSTRAP_H
 | |
| #define BOOTSTRAP_H
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include "cxrs.h"
 | |
| 
 | |
| /* If we're not using GNU C, elide __attribute__ */
 | |
| #ifndef __GNUC__
 | |
| #  define  __attribute__(x)  /*NOTHING*/
 | |
| #endif
 | |
| 
 | |
| typedef struct object object;
 | |
| 
 | |
| object *true;
 | |
| object *false;
 | |
| object *eof;
 | |
| object *empty_list;
 | |
| object *global_enviroment;
 | |
| 
 | |
| enum obj_type {
 | |
|         scm_bool,
 | |
|         scm_empty_list,
 | |
|         scm_eof,
 | |
|         scm_char,
 | |
|         scm_int,
 | |
|         scm_pair,
 | |
|         scm_symbol,
 | |
|         scm_prim_fun,
 | |
|         scm_lambda,
 | |
|         scm_str,
 | |
|         scm_file
 | |
| };
 | |
| 
 | |
| typedef object *(*prim_proc)(object *args);
 | |
| 
 | |
| object *read(FILE *in);
 | |
| object *eval(object *code, object *env);
 | |
| void print(FILE *out, object *obj, int display);
 | |
| 
 | |
| int check_type(enum obj_type type, object *obj, int err_on_false);
 | |
| 
 | |
| static inline int is_true(object *obj)
 | |
| {
 | |
|         return obj != false;
 | |
| }
 | |
| 
 | |
| object *make_int(int value);
 | |
| int obj2int(object *i);
 | |
| 
 | |
| object *make_bool(int value);
 | |
| int obj2bool(object *b);
 | |
| 
 | |
| object *make_char(char c);
 | |
| char obj2char(object *ch);
 | |
| 
 | |
| object *make_str(char *str);
 | |
| char *obj2str(object *str);
 | |
| 
 | |
| object *cons(object *car, object *cdr);
 | |
| object *car(object *pair);
 | |
| object *cdr(object *pair);
 | |
| void set_car(object *pair, object *new);
 | |
| void set_cdr(object *pair, object *new);
 | |
| 
 | |
| object *make_symbol(char *name);
 | |
| char *sym2str(object *sym);
 | |
| object *get_symbol(char *name) __attribute__((pure));
 | |
| 
 | |
| object *make_prim_fun(prim_proc fun);
 | |
| prim_proc obj2prim_proc(object *proc);
 | |
| 
 | |
| object *make_lambda(object *args, object *code, object *env);
 | |
| object *lambda_code(object *lambda);
 | |
| object *lambda_args(object *lambda);
 | |
| 
 | |
| object *make_port(FILE *handle, int direction);
 | |
| int port_direction(object *port);
 | |
| FILE *port_handle(object *port);
 | |
| void set_port_handle_to_null(object *port);
 | |
| 
 | |
| /*both of these should never be called*/
 | |
| object *apply_proc(object *);
 | |
| object *eval_proc(object *);
 | |
| 
 | |
| 
 | |
| object *maybe_add_begin(object *code);
 | |
| 
 | |
| void init_enviroment(object *env);
 | |
| 
 | |
| 
 | |
| void eval_err(char *msg, object *code) __attribute__((noreturn));
 | |
| 
 | |
| void define_var(object *var, object *val, object *env);
 | |
| void set_var(object *var, object *val, object *env);
 | |
| object *get_var(object *var, object *env);
 | |
| 
 | |
| object *cond2nested_if(object *cond);
 | |
| object *let2lambda(object *let);
 | |
| object *and2nested_if(object *and);
 | |
| object *or2nested_if(object *or);
 | |
| 
 | |
| #endif /*include guard*/
 |