remove pre-interned symbols
This commit is contained in:
		
							parent
							
								
									864a17d0be
								
							
						
					
					
						commit
						f89a55c082
					
				|  | @ -8,6 +8,9 @@ | |||
| #include "picrin/private/opcode.h" | ||||
| #include "picrin/private/state.h" | ||||
| 
 | ||||
| #define EQ(sym, lit) (strcmp(pic_str(pic, pic_sym_name(pic, sym)), lit) == 0) | ||||
| #define S(lit) (pic_intern_lit(pic, lit)) | ||||
| 
 | ||||
| static pic_value | ||||
| optimize_beta(pic_state *pic, pic_value expr) | ||||
| { | ||||
|  | @ -23,10 +26,10 @@ optimize_beta(pic_state *pic, pic_value expr) | |||
|   if (pic_sym_p(pic, pic_list_ref(pic, expr, 0))) { | ||||
|     pic_value sym = pic_list_ref(pic, expr, 0); | ||||
| 
 | ||||
|     if (pic_eq_p(pic, sym, pic->sQUOTE)) { | ||||
|     if (EQ(sym, "quote")) { | ||||
|       return expr; | ||||
|     } else if (pic_eq_p(pic, sym, pic->sLAMBDA)) { | ||||
|       return pic_list(pic, 3, pic->sLAMBDA, pic_list_ref(pic, expr, 1), optimize_beta(pic, pic_list_ref(pic, expr, 2))); | ||||
|     } else if (EQ(sym, "lambda")) { | ||||
|       return pic_list(pic, 3, S("lambda"), pic_list_ref(pic, expr, 1), optimize_beta(pic, pic_list_ref(pic, expr, 2))); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|  | @ -40,7 +43,7 @@ optimize_beta(pic_state *pic, pic_value expr) | |||
|   pic_protect(pic, expr); | ||||
| 
 | ||||
|   functor = pic_list_ref(pic, expr, 0); | ||||
|   if (pic_pair_p(pic, functor) && pic_eq_p(pic, pic_car(pic, functor), pic->sLAMBDA)) { | ||||
|   if (pic_pair_p(pic, functor) && EQ(pic_car(pic, functor), "lambda")) { | ||||
|     formals = pic_list_ref(pic, functor, 1); | ||||
|     if (! pic_list_p(pic, formals)) | ||||
|       goto exit;              /* TODO: support ((lambda args x) 1 2) */ | ||||
|  | @ -49,12 +52,12 @@ optimize_beta(pic_state *pic, pic_value expr) | |||
|       goto exit; | ||||
|     defs = pic_nil_value(pic); | ||||
|     pic_for_each (val, args, it) { | ||||
|       pic_push(pic, pic_list(pic, 3, pic->sDEFINE, pic_car(pic, formals), val), defs); | ||||
|       pic_push(pic, pic_list(pic, 3, S("define"), pic_car(pic, formals), val), defs); | ||||
|       formals = pic_cdr(pic, formals); | ||||
|     } | ||||
|     expr = pic_list_ref(pic, functor, 2); | ||||
|     pic_for_each (val, defs, it) { | ||||
|       expr = pic_list(pic, 3, pic->sBEGIN, val, expr); | ||||
|       expr = pic_list(pic, 3, S("begin"), val, expr); | ||||
|     } | ||||
|   } | ||||
|  exit: | ||||
|  | @ -159,11 +162,6 @@ define_var(pic_state *pic, analyze_scope *scope, pic_value sym) | |||
| static pic_value analyze(pic_state *, analyze_scope *, pic_value); | ||||
| static pic_value analyze_lambda(pic_state *, analyze_scope *, pic_value); | ||||
| 
 | ||||
| #define GREF pic_intern_lit(pic, "gref") | ||||
| #define LREF pic_intern_lit(pic, "lref") | ||||
| #define CREF pic_intern_lit(pic, "cref") | ||||
| #define CALL pic_intern_lit(pic, "call") | ||||
| 
 | ||||
| static pic_value | ||||
| analyze_var(pic_state *pic, analyze_scope *scope, pic_value sym) | ||||
| { | ||||
|  | @ -172,11 +170,11 @@ analyze_var(pic_state *pic, analyze_scope *scope, pic_value sym) | |||
|   depth = find_var(pic, scope, sym); | ||||
| 
 | ||||
|   if (depth == scope->depth) { | ||||
|     return pic_list(pic, 2, GREF, sym); | ||||
|     return pic_list(pic, 2, S("gref"), sym); | ||||
|   } else if (depth == 0) { | ||||
|     return pic_list(pic, 2, LREF, sym); | ||||
|     return pic_list(pic, 2, S("lref"), sym); | ||||
|   } else { | ||||
|     return pic_list(pic, 3, CREF, pic_int_value(pic, depth), sym); | ||||
|     return pic_list(pic, 3, S("cref"), pic_int_value(pic, depth), sym); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
|  | @ -255,7 +253,7 @@ analyze_lambda(pic_state *pic, analyze_scope *up, pic_value form) | |||
| 
 | ||||
|   analyzer_scope_destroy(pic, scope); | ||||
| 
 | ||||
|   return pic_list(pic, 6, pic->sLAMBDA, rest, args, locals, captures, body); | ||||
|   return pic_list(pic, 6, S("lambda"), rest, args, locals, captures, body); | ||||
| } | ||||
| 
 | ||||
| static pic_value | ||||
|  | @ -281,7 +279,7 @@ analyze_define(pic_state *pic, analyze_scope *scope, pic_value obj) | |||
| static pic_value | ||||
| analyze_call(pic_state *pic, analyze_scope *scope, pic_value obj) | ||||
| { | ||||
|   return pic_cons(pic, CALL, analyze_list(pic, scope, obj)); | ||||
|   return pic_cons(pic, S("call"), analyze_list(pic, scope, obj)); | ||||
| } | ||||
| 
 | ||||
| static pic_value | ||||
|  | @ -302,16 +300,16 @@ analyze_node(pic_state *pic, analyze_scope *scope, pic_value obj) | |||
|     if (pic_sym_p(pic, proc)) { | ||||
|       pic_value sym = proc; | ||||
| 
 | ||||
|       if (pic_eq_p(pic, sym, pic->sDEFINE)) { | ||||
|       if (EQ(sym, "define")) { | ||||
|         return analyze_define(pic, scope, obj); | ||||
|       } | ||||
|       else if (pic_eq_p(pic, sym, pic->sLAMBDA)) { | ||||
|       else if (EQ(sym, "lambda")) { | ||||
|         return analyze_defer(pic, scope, obj); | ||||
|       } | ||||
|       else if (pic_eq_p(pic, sym, pic->sQUOTE)) { | ||||
|       else if (EQ(sym, "quote")) { | ||||
|         return obj; | ||||
|       } | ||||
|       else if (pic_eq_p(pic, sym, pic->sBEGIN) || pic_eq_p(pic, sym, pic->sSETBANG) || pic_eq_p(pic, sym, pic->sIF)) { | ||||
|       else if (EQ(sym, "begin") || EQ(sym, "set!") || EQ(sym, "if")) { | ||||
|         return pic_cons(pic, pic_car(pic, obj), analyze_list(pic, scope, pic_cdr(pic, obj))); | ||||
|       } | ||||
|     } | ||||
|  | @ -319,7 +317,7 @@ analyze_node(pic_state *pic, analyze_scope *scope, pic_value obj) | |||
|     return analyze_call(pic, scope, obj); | ||||
|   } | ||||
|   default: | ||||
|     return pic_list(pic, 2, pic->sQUOTE, obj); | ||||
|     return pic_list(pic, 2, S("quote"), obj); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
|  | @ -547,14 +545,14 @@ codegen_ref(pic_state *pic, codegen_context *cxt, pic_value obj, bool tailpos) | |||
|   pic_value sym; | ||||
| 
 | ||||
|   sym = pic_car(pic, obj); | ||||
|   if (pic_eq_p(pic, sym, GREF)) { | ||||
|   if (EQ(sym, "gref")) { | ||||
|     pic_value name; | ||||
| 
 | ||||
|     name = pic_list_ref(pic, obj, 1); | ||||
|     emit_i(pic, cxt, OP_GREF, index_global(pic, cxt, name)); | ||||
|     emit_ret(pic, cxt, tailpos); | ||||
|   } | ||||
|   else if (pic_eq_p(pic, sym, CREF)) { | ||||
|   else if (EQ(sym, "cref")) { | ||||
|     pic_value name; | ||||
|     int depth; | ||||
| 
 | ||||
|  | @ -563,7 +561,7 @@ codegen_ref(pic_state *pic, codegen_context *cxt, pic_value obj, bool tailpos) | |||
|     emit_r(pic, cxt, OP_CREF, depth, index_capture(pic, cxt, name, depth)); | ||||
|     emit_ret(pic, cxt, tailpos); | ||||
|   } | ||||
|   else if (pic_eq_p(pic, sym, LREF)) { | ||||
|   else if (EQ(sym, "lref")) { | ||||
|     pic_value name; | ||||
|     int i; | ||||
| 
 | ||||
|  | @ -589,14 +587,14 @@ codegen_set(pic_state *pic, codegen_context *cxt, pic_value obj, bool tailpos) | |||
| 
 | ||||
|   var = pic_list_ref(pic, obj, 1); | ||||
|   type = pic_list_ref(pic, var, 0); | ||||
|   if (pic_eq_p(pic, type, GREF)) { | ||||
|   if (EQ(type, "gref")) { | ||||
|     pic_value name; | ||||
| 
 | ||||
|     name = pic_list_ref(pic, var, 1); | ||||
|     emit_i(pic, cxt, OP_GSET, index_global(pic, cxt, name)); | ||||
|     emit_ret(pic, cxt, tailpos); | ||||
|   } | ||||
|   else if (pic_eq_p(pic, type, CREF)) { | ||||
|   else if (EQ(type, "cref")) { | ||||
|     pic_value name; | ||||
|     int depth; | ||||
| 
 | ||||
|  | @ -605,7 +603,7 @@ codegen_set(pic_state *pic, codegen_context *cxt, pic_value obj, bool tailpos) | |||
|     emit_r(pic, cxt, OP_CSET, depth, index_capture(pic, cxt, name, depth)); | ||||
|     emit_ret(pic, cxt, tailpos); | ||||
|   } | ||||
|   else if (pic_eq_p(pic, type, LREF)) { | ||||
|   else if (EQ(type, "lref")) { | ||||
|     pic_value name; | ||||
|     int i; | ||||
| 
 | ||||
|  | @ -730,8 +728,8 @@ codegen_quote(pic_state *pic, codegen_context *cxt, pic_value obj, bool tailpos) | |||
|   emit_ret(pic, cxt, tailpos); | ||||
| } | ||||
| 
 | ||||
| #define VM(uid, op)                             \ | ||||
|   if (pic_eq_p(pic, sym, uid)) {                \ | ||||
| #define VM(name, op)                            \ | ||||
|   if (EQ(sym, name)) {                          \ | ||||
|     emit_i(pic, cxt, op, len - 1);              \ | ||||
|     emit_ret(pic, cxt, tailpos);                \ | ||||
|     return;                                     \ | ||||
|  | @ -748,27 +746,27 @@ codegen_call(pic_state *pic, codegen_context *cxt, pic_value obj, bool tailpos) | |||
|   } | ||||
| 
 | ||||
|   functor = pic_list_ref(pic, obj, 1); | ||||
|   if (pic_eq_p(pic, pic_list_ref(pic, functor, 0), GREF)) { | ||||
|   if (EQ(pic_list_ref(pic, functor, 0), "gref")) { | ||||
|     pic_value sym; | ||||
| 
 | ||||
|     sym = pic_list_ref(pic, functor, 1); | ||||
| 
 | ||||
|     VM(pic->sCONS, OP_CONS) | ||||
|     VM(pic->sCAR, OP_CAR) | ||||
|     VM(pic->sCDR, OP_CDR) | ||||
|     VM(pic->sNILP, OP_NILP) | ||||
|     VM(pic->sSYMBOLP, OP_SYMBOLP) | ||||
|     VM(pic->sPAIRP, OP_PAIRP) | ||||
|     VM(pic->sNOT, OP_NOT) | ||||
|     VM(pic->sEQ, OP_EQ) | ||||
|     VM(pic->sLT, OP_LT) | ||||
|     VM(pic->sLE, OP_LE) | ||||
|     VM(pic->sGT, OP_GT) | ||||
|     VM(pic->sGE, OP_GE) | ||||
|     VM(pic->sADD, OP_ADD) | ||||
|     VM(pic->sSUB, OP_SUB) | ||||
|     VM(pic->sMUL, OP_MUL) | ||||
|     VM(pic->sDIV, OP_DIV) | ||||
|     VM("cons", OP_CONS) | ||||
|     VM("car", OP_CAR) | ||||
|     VM("cdr", OP_CDR) | ||||
|     VM("null?", OP_NILP) | ||||
|     VM("symbol?", OP_SYMBOLP) | ||||
|     VM("pair?", OP_PAIRP) | ||||
|     VM("not", OP_NOT) | ||||
|     VM("=", OP_EQ) | ||||
|     VM("<", OP_LT) | ||||
|     VM("<=", OP_LE) | ||||
|     VM(">", OP_GT) | ||||
|     VM(">=", OP_GE) | ||||
|     VM("+", OP_ADD) | ||||
|     VM("-", OP_SUB) | ||||
|     VM("*", OP_MUL) | ||||
|     VM("/", OP_DIV) | ||||
|   } | ||||
| 
 | ||||
|   emit_i(pic, cxt, (tailpos ? OP_TAILCALL : OP_CALL), len - 1); | ||||
|  | @ -780,25 +778,25 @@ codegen(pic_state *pic, codegen_context *cxt, pic_value obj, bool tailpos) | |||
|   pic_value sym; | ||||
| 
 | ||||
|   sym = pic_car(pic, obj); | ||||
|   if (pic_eq_p(pic, sym, GREF) || pic_eq_p(pic, sym, CREF) || pic_eq_p(pic, sym, LREF)) { | ||||
|   if (EQ(sym, "gref") || EQ(sym, "cref") || EQ(sym, "lref")) { | ||||
|     codegen_ref(pic, cxt, obj, tailpos); | ||||
|   } | ||||
|   else if (pic_eq_p(pic, sym, pic->sSETBANG) || pic_eq_p(pic, sym, pic->sDEFINE)) { | ||||
|   else if (EQ(sym, "set!") || EQ(sym, "define")) { | ||||
|     codegen_set(pic, cxt, obj, tailpos); | ||||
|   } | ||||
|   else if (pic_eq_p(pic, sym, pic->sLAMBDA)) { | ||||
|   else if (EQ(sym, "lambda")) { | ||||
|     codegen_lambda(pic, cxt, obj, tailpos); | ||||
|   } | ||||
|   else if (pic_eq_p(pic, sym, pic->sIF)) { | ||||
|   else if (EQ(sym, "if")) { | ||||
|     codegen_if(pic, cxt, obj, tailpos); | ||||
|   } | ||||
|   else if (pic_eq_p(pic, sym, pic->sBEGIN)) { | ||||
|   else if (EQ(sym, "begin")) { | ||||
|     codegen_begin(pic, cxt, obj, tailpos); | ||||
|   } | ||||
|   else if (pic_eq_p(pic, sym, pic->sQUOTE)) { | ||||
|   else if (EQ(sym, "quote")) { | ||||
|     codegen_quote(pic, cxt, obj, tailpos); | ||||
|   } | ||||
|   else if (pic_eq_p(pic, sym, CALL)) { | ||||
|   else if (EQ(sym, "call")) { | ||||
|     codegen_call(pic, cxt, obj, tailpos); | ||||
|   } | ||||
|   else { | ||||
|  |  | |||
|  | @ -416,8 +416,6 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) | |||
|   } | ||||
| } | ||||
| 
 | ||||
| #define M(x) gc_mark(pic, pic->x) | ||||
| 
 | ||||
| static void | ||||
| gc_mark_phase(pic_state *pic) | ||||
| { | ||||
|  | @ -465,15 +463,6 @@ gc_mark_phase(pic_state *pic) | |||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /* mark reserved symbols */ | ||||
|   M(sDEFINE); M(sDEFINE_MACRO); M(sLAMBDA); M(sIF); M(sBEGIN); M(sSETBANG); | ||||
|   M(sQUOTE); M(sQUASIQUOTE); M(sUNQUOTE); M(sUNQUOTE_SPLICING); | ||||
|   M(sSYNTAX_QUOTE); M(sSYNTAX_QUASIQUOTE); M(sSYNTAX_UNQUOTE); M(sSYNTAX_UNQUOTE_SPLICING); | ||||
|   M(sDEFINE_LIBRARY); M(sIMPORT); M(sEXPORT); M(sCOND_EXPAND); | ||||
| 
 | ||||
|   M(sCONS); M(sCAR); M(sCDR); M(sNILP); M(sSYMBOLP); M(sPAIRP); | ||||
|   M(sADD); M(sSUB); M(sMUL); M(sDIV); M(sEQ); M(sLT); M(sLE); M(sGT); M(sGE); M(sNOT); | ||||
| 
 | ||||
|   /* global variables */ | ||||
|   gc_mark(pic, pic->globals); | ||||
| 
 | ||||
|  | @ -670,7 +659,7 @@ gc_sweep_phase(pic_state *pic) | |||
|     if (! kh_exist(s, it)) | ||||
|       continue; | ||||
|     sym = kh_val(s, it); | ||||
|     if (sym->gc_mark == WHITE) { | ||||
|     if (sym && sym->gc_mark == WHITE) { | ||||
|       kh_del(oblist, s, it); | ||||
|     } | ||||
|   } | ||||
|  |  | |||
|  | @ -9,8 +9,6 @@ | |||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| struct pic_heap; | ||||
| 
 | ||||
| struct pic_heap *pic_heap_open(pic_state *); | ||||
| void pic_heap_close(pic_state *, struct pic_heap *); | ||||
| 
 | ||||
|  |  | |||
|  | @ -59,14 +59,6 @@ struct pic_state { | |||
| 
 | ||||
|   struct pic_lib *lib; | ||||
| 
 | ||||
|   pic_value sDEFINE, sDEFINE_MACRO, sLAMBDA, sIF, sBEGIN, sSETBANG; | ||||
|   pic_value sQUOTE, sQUASIQUOTE, sUNQUOTE, sUNQUOTE_SPLICING; | ||||
|   pic_value sSYNTAX_QUOTE, sSYNTAX_QUASIQUOTE; | ||||
|   pic_value sSYNTAX_UNQUOTE, sSYNTAX_UNQUOTE_SPLICING; | ||||
|   pic_value sDEFINE_LIBRARY, sIMPORT, sEXPORT, sCOND_EXPAND; | ||||
|   pic_value sCONS, sCAR, sCDR, sNILP, sSYMBOLP, sPAIRP; | ||||
|   pic_value sADD, sSUB, sMUL, sDIV, sEQ, sLT, sLE, sGT, sGE, sNOT; | ||||
| 
 | ||||
|   pic_value features; | ||||
| 
 | ||||
|   khash_t(oblist) oblist;       /* string to symbol */ | ||||
|  |  | |||
|  | @ -46,11 +46,13 @@ make_library_env(pic_state *pic, pic_value name) | |||
| 
 | ||||
|   e = pic_obj_value(env); | ||||
| 
 | ||||
| #define REGISTER(name) pic_put_identifier(pic, pic_intern_lit(pic, name), pic_intern_lit(pic, name), e) | ||||
| 
 | ||||
|   /* set up default environment */ | ||||
|   pic_put_identifier(pic, pic->sDEFINE_LIBRARY, pic->sDEFINE_LIBRARY, e); | ||||
|   pic_put_identifier(pic, pic->sIMPORT, pic->sIMPORT, e); | ||||
|   pic_put_identifier(pic, pic->sEXPORT, pic->sEXPORT, e); | ||||
|   pic_put_identifier(pic, pic->sCOND_EXPAND, pic->sCOND_EXPAND, e); | ||||
|   REGISTER("define-library"); | ||||
|   REGISTER("import"); | ||||
|   REGISTER("export"); | ||||
|   REGISTER("cond-expand"); | ||||
| 
 | ||||
|   return e; | ||||
| } | ||||
|  |  | |||
|  | @ -139,6 +139,9 @@ shadow_macro(pic_state *pic, pic_value uid) | |||
| static pic_value expand(pic_state *, pic_value expr, pic_value env, pic_value deferred); | ||||
| static pic_value expand_lambda(pic_state *, pic_value expr, pic_value env); | ||||
| 
 | ||||
| #define EQ(sym, lit) (strcmp(pic_str(pic, pic_sym_name(pic, sym)), lit) == 0) | ||||
| #define S(lit) (pic_intern_lit(pic, lit)) | ||||
| 
 | ||||
| static pic_value | ||||
| expand_var(pic_state *pic, pic_value id, pic_value env, pic_value deferred) | ||||
| { | ||||
|  | @ -155,7 +158,7 @@ expand_var(pic_state *pic, pic_value id, pic_value env, pic_value deferred) | |||
| static pic_value | ||||
| expand_quote(pic_state *pic, pic_value expr) | ||||
| { | ||||
|   return pic_cons(pic, pic->sQUOTE, pic_cdr(pic, expr)); | ||||
|   return pic_cons(pic, S("quote"), pic_cdr(pic, expr)); | ||||
| } | ||||
| 
 | ||||
| static pic_value | ||||
|  | @ -229,7 +232,7 @@ expand_lambda(pic_state *pic, pic_value expr, pic_value env) | |||
| 
 | ||||
|   expand_deferred(pic, deferred, in); | ||||
| 
 | ||||
|   return pic_list(pic, 3, pic->sLAMBDA, formal, body); | ||||
|   return pic_list(pic, 3, S("lambda"), formal, body); | ||||
| } | ||||
| 
 | ||||
| static pic_value | ||||
|  | @ -245,7 +248,7 @@ expand_define(pic_state *pic, pic_value expr, pic_value env, pic_value deferred) | |||
|   } | ||||
|   val = expand(pic, pic_list_ref(pic, expr, 2), env, deferred); | ||||
| 
 | ||||
|   return pic_list(pic, 3, pic->sDEFINE, uid, val); | ||||
|   return pic_list(pic, 3, S("define"), uid, val); | ||||
| } | ||||
| 
 | ||||
| static pic_value | ||||
|  | @ -289,16 +292,16 @@ expand_node(pic_state *pic, pic_value expr, pic_value env, pic_value deferred) | |||
| 
 | ||||
|       functor = pic_find_identifier(pic, pic_car(pic, expr), env); | ||||
| 
 | ||||
|       if (pic_eq_p(pic, functor, pic->sDEFINE_MACRO)) { | ||||
|       if (EQ(functor, "define-macro")) { | ||||
|         return expand_defmacro(pic, expr, env); | ||||
|       } | ||||
|       else if (pic_eq_p(pic, functor, pic->sLAMBDA)) { | ||||
|       else if (EQ(functor, "lambda")) { | ||||
|         return expand_defer(pic, expr, deferred); | ||||
|       } | ||||
|       else if (pic_eq_p(pic, functor, pic->sDEFINE)) { | ||||
|       else if (EQ(functor, "define")) { | ||||
|         return expand_define(pic, expr, env, deferred); | ||||
|       } | ||||
|       else if (pic_eq_p(pic, functor, pic->sQUOTE)) { | ||||
|       else if (EQ(functor, "quote")) { | ||||
|         return expand_quote(pic, expr); | ||||
|       } | ||||
| 
 | ||||
|  |  | |||
|  | @ -151,23 +151,25 @@ read_directive(pic_state *pic, xFILE *file, int c) | |||
| static pic_value | ||||
| read_quote(pic_state *pic, xFILE *file, int PIC_UNUSED(c)) | ||||
| { | ||||
|   return pic_list(pic, 2, pic->sQUOTE, read(pic, file, next(pic, file))); | ||||
|   return pic_list(pic, 2, pic_intern_lit(pic, "quote"), read(pic, file, next(pic, file))); | ||||
| } | ||||
| 
 | ||||
| static pic_value | ||||
| read_quasiquote(pic_state *pic, xFILE *file, int PIC_UNUSED(c)) | ||||
| { | ||||
|   return pic_list(pic, 2, pic->sQUASIQUOTE, read(pic, file, next(pic, file))); | ||||
|   return pic_list(pic, 2, pic_intern_lit(pic, "quasiquote"), read(pic, file, next(pic, file))); | ||||
| } | ||||
| 
 | ||||
| static pic_value | ||||
| read_unquote(pic_state *pic, xFILE *file, int PIC_UNUSED(c)) | ||||
| { | ||||
|   pic_value tag = pic->sUNQUOTE; | ||||
|   pic_value tag; | ||||
| 
 | ||||
|   if (peek(pic, file) == '@') { | ||||
|     tag = pic->sUNQUOTE_SPLICING; | ||||
|     tag = pic_intern_lit(pic, "unquote-splicing"); | ||||
|     next(pic, file); | ||||
|   } else { | ||||
|     tag = pic_intern_lit(pic, "unquote"); | ||||
|   } | ||||
|   return pic_list(pic, 2, tag, read(pic, file, next(pic, file))); | ||||
| } | ||||
|  | @ -175,23 +177,25 @@ read_unquote(pic_state *pic, xFILE *file, int PIC_UNUSED(c)) | |||
| static pic_value | ||||
| read_syntax_quote(pic_state *pic, xFILE *file, int PIC_UNUSED(c)) | ||||
| { | ||||
|   return pic_list(pic, 2, pic->sSYNTAX_QUOTE, read(pic, file, next(pic, file))); | ||||
|   return pic_list(pic, 2, pic_intern_lit(pic, "syntax-quote"), read(pic, file, next(pic, file))); | ||||
| } | ||||
| 
 | ||||
| static pic_value | ||||
| read_syntax_quasiquote(pic_state *pic, xFILE *file, int PIC_UNUSED(c)) | ||||
| { | ||||
|   return pic_list(pic, 2, pic->sSYNTAX_QUASIQUOTE, read(pic, file, next(pic, file))); | ||||
|   return pic_list(pic, 2, pic_intern_lit(pic, "syntax-quasiquote"), read(pic, file, next(pic, file))); | ||||
| } | ||||
| 
 | ||||
| static pic_value | ||||
| read_syntax_unquote(pic_state *pic, xFILE *file, int PIC_UNUSED(c)) | ||||
| { | ||||
|   pic_value tag = pic->sSYNTAX_UNQUOTE; | ||||
|   pic_value tag; | ||||
| 
 | ||||
|   if (peek(pic, file) == '@') { | ||||
|     tag = pic->sSYNTAX_UNQUOTE_SPLICING; | ||||
|     tag = pic_intern_lit(pic, "syntax-unquote-splicing"); | ||||
|     next(pic, file); | ||||
|   } else { | ||||
|     tag = pic_intern_lit(pic, "syntax-unquote"); | ||||
|   } | ||||
|   return pic_list(pic, 2, tag, read(pic, file, next(pic, file))); | ||||
| } | ||||
|  |  | |||
|  | @ -193,7 +193,6 @@ pic_open(pic_allocf allocf, void *userdata) | |||
|   char t; | ||||
| 
 | ||||
|   pic_state *pic; | ||||
|   size_t ai; | ||||
| 
 | ||||
|   pic = allocf(userdata, NULL, sizeof(pic_state)); | ||||
| 
 | ||||
|  | @ -260,10 +259,10 @@ pic_open(pic_allocf allocf, void *userdata) | |||
|   pic->ucnt = 0; | ||||
| 
 | ||||
|   /* global variables */ | ||||
|   pic->globals = pic_make_weak(pic); | ||||
|   pic->globals = pic_invalid_value(pic); | ||||
| 
 | ||||
|   /* macros */ | ||||
|   pic->macros = pic_make_weak(pic); | ||||
|   pic->macros = pic_invalid_value(pic); | ||||
| 
 | ||||
|   /* features */ | ||||
|   pic->features = pic_nil_value(pic); | ||||
|  | @ -299,48 +298,6 @@ pic_open(pic_allocf allocf, void *userdata) | |||
|   /* native stack marker */ | ||||
|   pic->native_stack_start = &t; | ||||
| 
 | ||||
|   ai = pic_enter(pic); | ||||
| 
 | ||||
| #define S(slot,name) pic->slot = pic_intern_lit(pic, name) | ||||
| 
 | ||||
|   S(sDEFINE, "define"); | ||||
|   S(sDEFINE_MACRO, "define-macro"); | ||||
|   S(sLAMBDA, "lambda"); | ||||
|   S(sIF, "if"); | ||||
|   S(sBEGIN, "begin"); | ||||
|   S(sSETBANG, "set!"); | ||||
|   S(sQUOTE, "quote"); | ||||
|   S(sQUASIQUOTE, "quasiquote"); | ||||
|   S(sUNQUOTE, "unquote"); | ||||
|   S(sUNQUOTE_SPLICING, "unquote-splicing"); | ||||
|   S(sSYNTAX_QUOTE, "syntax-quote"); | ||||
|   S(sSYNTAX_QUASIQUOTE, "syntax-quasiquote"); | ||||
|   S(sSYNTAX_UNQUOTE, "syntax-unquote"); | ||||
|   S(sSYNTAX_UNQUOTE_SPLICING, "syntax-unquote-splicing"); | ||||
|   S(sIMPORT, "import"); | ||||
|   S(sEXPORT, "export"); | ||||
|   S(sDEFINE_LIBRARY, "define-library"); | ||||
|   S(sCOND_EXPAND, "cond-expand"); | ||||
| 
 | ||||
|   S(sCONS, "cons"); | ||||
|   S(sCAR, "car"); | ||||
|   S(sCDR, "cdr"); | ||||
|   S(sNILP, "null?"); | ||||
|   S(sSYMBOLP, "symbol?"); | ||||
|   S(sPAIRP, "pair?"); | ||||
|   S(sADD, "+"); | ||||
|   S(sSUB, "-"); | ||||
|   S(sMUL, "*"); | ||||
|   S(sDIV, "/"); | ||||
|   S(sEQ, "="); | ||||
|   S(sLT, "<"); | ||||
|   S(sLE, "<="); | ||||
|   S(sGT, ">"); | ||||
|   S(sGE, ">="); | ||||
|   S(sNOT, "not"); | ||||
| 
 | ||||
|   pic_leave(pic, ai); | ||||
| 
 | ||||
|   /* root tables */ | ||||
|   pic->globals = pic_make_weak(pic); | ||||
|   pic->macros = pic_make_weak(pic); | ||||
|  | @ -355,20 +312,18 @@ pic_open(pic_allocf allocf, void *userdata) | |||
|   pic_reader_init(pic); | ||||
| 
 | ||||
|   /* parameter table */ | ||||
|   pic->ptable = pic_cons(pic, pic_make_weak(pic), pic->ptable); | ||||
|   pic->ptable = pic_cons(pic, pic_make_weak(pic), pic_nil_value(pic)); | ||||
| 
 | ||||
|   /* standard libraries */ | ||||
|   pic_make_library(pic, "picrin.user"); | ||||
|   pic_in_library(pic, "picrin.user"); | ||||
| 
 | ||||
|   pic_leave(pic, ai); | ||||
| 
 | ||||
|   /* turn on GC */ | ||||
|   pic->gc_enable = true; | ||||
| 
 | ||||
|   pic_init_core(pic); | ||||
| 
 | ||||
|   pic_leave(pic, ai); | ||||
|   pic_leave(pic, 0);            /* empty arena */ | ||||
| 
 | ||||
|   return pic; | ||||
| 
 | ||||
|  |  | |||
|  | @ -27,7 +27,7 @@ pic_intern(pic_state *pic, pic_value str) | |||
|     return pic_obj_value(sym); | ||||
|   } | ||||
| 
 | ||||
|   kh_val(h, it) = pic_sym_ptr(pic, pic->sQUOTE); /* dummy */ | ||||
|   kh_val(h, it) = NULL;         /* dummy */ | ||||
| 
 | ||||
|   sym = (pic_sym *)pic_obj_alloc(pic, offsetof(pic_sym, env), PIC_TYPE_SYMBOL); | ||||
|   sym->u.str = pic_str_ptr(pic, str); | ||||
|  |  | |||
|  | @ -5,7 +5,6 @@ | |||
| #include "picrin.h" | ||||
| #include "picrin/extra.h" | ||||
| #include "picrin/private/object.h" | ||||
| #include "picrin/private/state.h" | ||||
| 
 | ||||
| KHASH_DECLARE(l, void *, int) | ||||
| KHASH_DECLARE(v, void *, int) | ||||
|  | @ -170,6 +169,8 @@ write_pair_help(struct writer_control *p, pic_value pair) | |||
|   } | ||||
| } | ||||
| 
 | ||||
| #define EQ(sym, lit) (strcmp(pic_str(pic, pic_sym_name(pic, sym)), lit) == 0) | ||||
| 
 | ||||
| static void | ||||
| write_pair(struct writer_control *p, pic_value pair) | ||||
| { | ||||
|  | @ -179,42 +180,42 @@ write_pair(struct writer_control *p, pic_value pair) | |||
| 
 | ||||
|   if (pic_pair_p(pic, pic_cdr(pic, pair)) && pic_nil_p(pic, pic_cddr(pic, pair)) && pic_sym_p(pic, pic_car(pic, pair))) { | ||||
|     tag = pic_car(pic, pair); | ||||
|     if (pic_eq_p(pic, tag, pic->sQUOTE)) { | ||||
|     if (EQ(tag, "quote")) { | ||||
|       xfprintf(pic, file, "'"); | ||||
|       write_core(p, pic_cadr(pic, pair)); | ||||
|       return; | ||||
|     } | ||||
|     else if (pic_eq_p(pic, tag, pic->sUNQUOTE)) { | ||||
|     else if (EQ(tag, "unquote")) { | ||||
|       xfprintf(pic, file, ","); | ||||
|       write_core(p, pic_cadr(pic, pair)); | ||||
|       return; | ||||
|     } | ||||
|     else if (pic_eq_p(pic, tag, pic->sUNQUOTE_SPLICING)) { | ||||
|     else if (EQ(tag, "unquote-splicing")) { | ||||
|       xfprintf(pic, file, ",@"); | ||||
|       write_core(p, pic_cadr(pic, pair)); | ||||
|       return; | ||||
|     } | ||||
|     else if (pic_eq_p(pic, tag, pic->sQUASIQUOTE)) { | ||||
|     else if (EQ(tag, "quasiquote")) { | ||||
|       xfprintf(pic, file, "`"); | ||||
|       write_core(p, pic_cadr(pic, pair)); | ||||
|       return; | ||||
|     } | ||||
|     else if (pic_eq_p(pic, tag, pic->sSYNTAX_QUOTE)) { | ||||
|     else if (EQ(tag, "syntax-quote")) { | ||||
|       xfprintf(pic, file, "#'"); | ||||
|       write_core(p, pic_cadr(pic, pair)); | ||||
|       return; | ||||
|     } | ||||
|     else if (pic_eq_p(pic, tag, pic->sSYNTAX_UNQUOTE)) { | ||||
|     else if (EQ(tag, "syntax-unquote")) { | ||||
|       xfprintf(pic, file, "#,"); | ||||
|       write_core(p, pic_cadr(pic, pair)); | ||||
|       return; | ||||
|     } | ||||
|     else if (pic_eq_p(pic, tag, pic->sSYNTAX_UNQUOTE_SPLICING)) { | ||||
|     else if (EQ(tag, "syntax-unquote-splicing")) { | ||||
|       xfprintf(pic, file, "#,@"); | ||||
|       write_core(p, pic_cadr(pic, pair)); | ||||
|       return; | ||||
|     } | ||||
|     else if (pic_eq_p(pic, tag, pic->sSYNTAX_QUASIQUOTE)) { | ||||
|     else if (EQ(tag, "syntax-quasiquote")) { | ||||
|       xfprintf(pic, file, "#`"); | ||||
|       write_core(p, pic_cadr(pic, pair)); | ||||
|       return; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Yuichi Nishiwaki
						Yuichi Nishiwaki