diff --git a/GNUmakefile b/GNUmakefile index c6b8d9a1..fbe63fe0 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -24,7 +24,6 @@ all: mes mes.o: mes.c mes.o: mes.c mes.h mes.i mes.environment.i mes.symbols.i -mes.o: cache.c cache.h cache.i cache.environment.i mes.o: define.c define.h define.i define.environment.i mes.o: display.c display.h display.i display.environment.i mes.o: lib.c lib.h lib.i lib.environment.i diff --git a/cache.c b/cache.c deleted file mode 100644 index 58e03f18..00000000 --- a/cache.c +++ /dev/null @@ -1,103 +0,0 @@ -/* -*-comment-start: "//";comment-end:""-*- - * Mes --- Maxwell Equations of Software - * Copyright © 2016 Jan Nieuwenhuizen - * - * This file is part of Mes. - * - * Mes is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or (at - * your option) any later version. - * - * Mes is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Mes. If not, see . - */ - -#define CACHE_SIZE 30 -#define ENV_HEAD 15 - -#if! ENV_CACHE -SCM cache_invalidate (SCM x){} -SCM cache_invalidate_range (SCM p,SCM a){} -SCM cache_save (SCM p){} -SCM cache_lookup (SCM x){} -#else // ENV_CACHE - -SCM env_cache_cars[CACHE_SIZE]; -SCM env_cache_cdrs[CACHE_SIZE]; -int cache_threshold = 0; -SCM -cache_save (SCM p) -{ - int n = g_cells[car (p)].hits; - if (n < cache_threshold) return cell_unspecified; - int j = -1; - for (int i=0; i < CACHE_SIZE; i++) { - if (!env_cache_cars[i]) { - j = i; - break; - } - if (env_cache_cars[i] == car (p)) return cell_unspecified; - if (n > g_cells[env_cache_cars[i]].hits) { - n = g_cells[env_cache_cars[i]].hits; - j = i; - } - } - if (j >= 0) { - cache_threshold = g_cells[car (p)].hits; - env_cache_cars[j] = car (p); - env_cache_cdrs[j] = cdr (p); - } - return cell_unspecified; -} - -SCM -cache_lookup (SCM x) -{ - for (int i=0; i < CACHE_SIZE; i++) { - if (!env_cache_cars[i]) break; - if (env_cache_cars[i] == x) return env_cache_cdrs[i]; - } - return cell_undefined; -} - -SCM -cache_invalidate (SCM x) -{ - for (int i=0; i < CACHE_SIZE; i++) { - if (env_cache_cars[i] == x) { - env_cache_cars[i] = 0; - break; - } - } - return cell_unspecified; -} - -SCM -cache_invalidate_range (SCM p, SCM a) -{ - do { - cache_invalidate (caar (p)); - p = cdr (p); - } while (p != a); - return cell_unspecified; -} - -SCM -assq_ref_cache (SCM x, SCM a) ///((internal)) -{ - g_cells[x].hits++; - SCM c = cache_lookup (x); - if (c != cell_undefined) return c; - int i = 0; - while (a != cell_nil && x != CAAR (a)) {i++;a = cdr (a);} - if (a == cell_nil) return cell_undefined; - if (i>ENV_HEAD) cache_save (car (a)); - return cdar (a); -} -#endif // ENV_CACHE diff --git a/define.c b/define.c index dd661218..31521197 100644 --- a/define.c +++ b/define.c @@ -35,7 +35,6 @@ vm_define_env () else { r2 = car (r2); SCM p = pairlis (cadr (r1), cadr (r1), r0); - cache_invalidate_range (p, r0); x = eval_env (make_lambda (cdadr (r1), cddr (r1)), p); } if (eq_p (car (r1), cell_symbol_define_macro) == cell_t) diff --git a/mes.c b/mes.c index 91705885..e1956300 100644 --- a/mes.c +++ b/mes.c @@ -31,7 +31,8 @@ #define DEBUG 0 #define QUASIQUOTE 1 #define QUASISYNTAX 0 -#define ENV_CACHE 1 +#define ENV_CACHE 0 +#define FIXED_PRIMITIVES 1 int ARENA_SIZE = 100000; int MAX_ARENA_SIZE = 20000000; @@ -78,7 +79,6 @@ function functions[200]; int g_function = 0; #include "mes.symbols.h" -#include "cache.h" #include "define.h" #include "display.h" #include "lib.h" @@ -144,6 +144,12 @@ scm scm_symbol_primitive_load = {SYMBOL, "primitive-load"}; scm scm_symbol_the_unquoters = {SYMBOL, "*the-unquoters*"}; +scm scm_symbol_car = {SYMBOL, "car"}; +scm scm_symbol_cdr = {SYMBOL, "cdr"}; +scm scm_symbol_null_p = {SYMBOL, "null?"}; +scm scm_symbol_eq_p = {SYMBOL, "eq?"}; +scm scm_symbol_cons = {SYMBOL, "cons"}; + scm char_eof = {CHAR, .name="*eof*", .value=-1}; scm char_nul = {CHAR, .name="nul", .value=0}; scm char_backspace = {CHAR, .name="backspace", .value=8}; @@ -177,6 +183,7 @@ scm *g_news = 0; #define CDAR(x) CDR (CAR (x)) #define CAAR(x) CAR (CAR (x)) #define CADAR(x) CAR (CDR (CAR (x))) +#define CADDR(x) CAR (CDR (CDR (x))) #define CDADAR(x) CAR (CDR (CAR (CDR (x)))) #define CADR(x) CAR (CDR (x)) @@ -255,7 +262,6 @@ SCM set_cdr_x (SCM x, SCM e) { assert (TYPE (x) == PAIR); - cache_invalidate (cdr (x)); CDR (x) = e; return cell_unspecified; } @@ -263,7 +269,6 @@ set_cdr_x (SCM x, SCM e) SCM set_env_x (SCM x, SCM e, SCM a) { - cache_invalidate (x); SCM p = assert_defined (x, assq (x, a)); return set_cdr_x (p, e); } @@ -309,7 +314,6 @@ assq (SCM x, SCM a) return a != cell_nil ? car (a) : cell_f; } -#if! ENV_CACHE SCM assq_ref_cache (SCM x, SCM a) { @@ -317,7 +321,6 @@ assq_ref_cache (SCM x, SCM a) if (x == cell_f) return cell_undefined; return cdr (x); } -#endif // !ENV_CACHE SCM assert_defined (SCM x, SCM e) @@ -356,10 +359,7 @@ call_lambda (SCM e, SCM x, SCM aa, SCM a) ///((internal)) r0 = cl; r2 = a; r3 = aa; - cache_invalidate_range (r0, CDR (r3)); - SCM r = vm_call_lambda (); - cache_invalidate_range (r0, CDR (r3)); - return r; + return vm_call_lambda (); } SCM @@ -417,6 +417,18 @@ vm_eval_env () { case PAIR: { +#if FIXED_PRIMITIVES + if (car (r1) == cell_symbol_car) + return car (eval_env (CADR (r1), r0)); + if (car (r1) == cell_symbol_cdr) + return cdr (eval_env (CADR (r1), r0)); + if (car (r1) == cell_symbol_cons) { + SCM m = evlis_env (CDR (r1), r0); + return cons (CAR (m), CADR (m)); + } + if (car (r1) == cell_symbol_null_p) + return null_p (eval_env (CADR (r1), r0)); +#endif // FIXED_PRIMITIVES if (car (r1) == cell_symbol_quote) return cadr (r1); #if QUASISYNTAX @@ -589,10 +601,7 @@ vm_call (function0_t f, SCM p1, SCM p2, SCM a) r2 = p2; r0 = a; if (g_free.value + GC_SAFETY > ARENA_SIZE) - { - cache_invalidate_range (r0, cell_nil); - gc_stack (stack); - } + gc_stack (stack); SCM r = f (); frame = gc_frame (stack); @@ -1086,7 +1095,6 @@ mes_builtins (SCM a) { #include "mes.i" -#include "cache.i" #include "define.i" #include "display.i" #include "lib.i" @@ -1097,7 +1105,6 @@ mes_builtins (SCM a) #include "string.i" #include "type.i" -#include "cache.environment.i" #include "define.environment.i" #include "display.environment.i" #include "lib.environment.i" @@ -1228,7 +1235,6 @@ bload_env (SCM a) } #include "type.c" -#include "cache.c" #include "define.c" #include "display.c" #include "lib.c"