From 66b53669f8e08c89730c1b4ed0a894051903acf5 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Sun, 26 Mar 2017 21:13:01 +0200 Subject: [PATCH] mescc: Run module/base-0.mes. * gc.c: New file. * vector.c: New file. * mes.c: Remove vector and gc functions, include vector.c, gc.c. * GNUmakefile (mes.o): Add gc, vector dependencies. * scaffold/mini-mes.c (eval_apply): Support primitive-load through read_input_file. (getenv_, open_input_file, current_input_port, set_current_input_port force_output, exit_, values, arity_, xassq, is_p, minus, plus, divide, modulo multiply, logior, ash): New function. (mes_symbols): Add symbols %gnuc, %mesc. * scaffold/mini-mes.c (): New functions. * scaffold/b-0.mes: New file. * scaffold/t-0.mes: New file. --- GNUmakefile | 2 + gc.c | 122 ++++++++ guile/mescc.scm | 2 +- lib.c | 33 +- math.c | 53 ++-- mes.c | 498 ++++--------------------------- mlibc.c | 2 + module/language/c99/compiler.mes | 5 +- module/mes/display.mes | 3 +- module/mes/libc.mes | 7 + module/mes/read-0-32.mo | Bin 83213 -> 0 bytes posix.c | 297 +++++++++++++----- scaffold/b-0.mes | 15 + scaffold/mini-mes.c | 491 ++++++++++++++++++++++-------- scaffold/t-0.mes | 2 + scaffold/t.c | 4 + vector.c | 90 ++++++ 17 files changed, 942 insertions(+), 684 deletions(-) create mode 100644 gc.c delete mode 100644 module/mes/read-0-32.mo create mode 100644 scaffold/b-0.mes create mode 100644 scaffold/t-0.mes create mode 100644 vector.c diff --git a/GNUmakefile b/GNUmakefile index 5fc75d7d..bb3eacdc 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -35,6 +35,8 @@ mes.o: lib.c lib.h lib.i lib.environment.i mes.o: math.c math.h math.i math.environment.i mes.o: posix.c posix.h posix.i posix.environment.i mes.o: reader.c reader.h reader.i reader.environment.i +mes.o: gc.c gc.h gc.i gc.environment.i +mes.o: vector.c vector.h vector.i vector.environment.i clean: rm -f mes *.o *.environment.i *.symbols.i *.environment.h *.cat a.out diff --git a/gc.c b/gc.c new file mode 100644 index 00000000..d257541d --- /dev/null +++ b/gc.c @@ -0,0 +1,122 @@ +/* -*-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 . + */ + +SCM +gc_up_arena () ///((internal)) +{ + ARENA_SIZE *= 2; + void *p = realloc (g_cells-1, 2*ARENA_SIZE*sizeof(struct scm)); + if (!p) error (cell_symbol_system_error, cons (MAKE_STRING (cstring_to_list (strerror (errno))), MAKE_NUMBER (g_free))); + g_cells = (struct scm*)p; + g_cells++; + gc_init_news (); +} + +SCM +gc_flip () ///((internal)) +{ + struct scm *cells = g_cells; + g_cells = g_news; + g_news = cells; + if (g_debug) fprintf (stderr, " => jam[%d]\n", g_free); + return g_stack; +} + +SCM +gc_copy (SCM old) ///((internal)) +{ + if (TYPE (old) == TBROKEN_HEART) return g_cells[old].car; + SCM new = g_free++; + g_news[new] = g_cells[old]; + if (NTYPE (new) == TVECTOR) + { + g_news[new].vector = g_free; + for (int i=0; i +;;; Copyright © 2016,2017 Jan Nieuwenhuizen ;;; ;;; This file is part of GNU Guix. ;;; diff --git a/lib.c b/lib.c index 5ef86037..ea5eb4f1 100644 --- a/lib.c +++ b/lib.c @@ -18,13 +18,6 @@ * along with Mes. If not, see . */ -SCM -xassq (SCM x, SCM a) ///for speed in core only -{ - while (a != cell_nil && x != CDAR (a)) a = CDR (a); - return a != cell_nil ? CAR (a) : cell_f; -} - //MINI_MES // SCM // length (SCM x) @@ -80,7 +73,7 @@ append (SCM x) ///((arity . n)) // } SCM -assert_defined (SCM x, SCM e) ///(internal) +assert_defined (SCM x, SCM e) ///((internal)) { if (e == cell_undefined) return error (cell_symbol_unbound_variable, x); return e; @@ -102,7 +95,7 @@ check_formals (SCM f, SCM formals, SCM args) ///((internal)) } SCM -check_apply (SCM f, SCM e) +check_apply (SCM f, SCM e) ///((internal)) { char const* type = 0; if (f == cell_f || f == cell_t) type = "bool"; @@ -242,3 +235,25 @@ bload_env (SCM a) ///((internal)) r0 = mes_builtins (r0); return r2; } + +SCM +values (SCM x) ///((arity . n)) +{ + SCM v = cons (0, x); + TYPE (v) = TVALUES; + return v; +} + +SCM +arity_ (SCM x) +{ + assert (TYPE (x) == TFUNCTION); + return MAKE_NUMBER (FUNCTION (x).arity); +} + +SCM +xassq (SCM x, SCM a) ///for speed in core only +{ + while (a != cell_nil && x != CDAR (a)) a = CDR (a); + return a != cell_nil ? CAR (a) : cell_f; +} diff --git a/math.c b/math.c index ee48bbce..11917fa6 100644 --- a/math.c +++ b/math.c @@ -18,34 +18,33 @@ * along with Mes. If not, see . */ -//MINI_MES -// SCM -// greater_p (SCM x) ///((name . ">") (arity . n)) -// { -// int n = INT_MAX; -// while (x != cell_nil) -// { -// assert (TYPE (car (x)) == TNUMBER); -// if (VALUE (car (x)) >= n) return cell_f; -// n = VALUE (car (x)); -// x = cdr (x); -// } -// return cell_t; -// } +SCM +greater_p (SCM x) ///((name . ">") (arity . n)) +{ + int n = INT_MAX; + while (x != cell_nil) + { + assert (TYPE (car (x)) == TNUMBER); + if (VALUE (car (x)) >= n) return cell_f; + n = VALUE (car (x)); + x = cdr (x); + } + return cell_t; +} -// SCM -// less_p (SCM x) ///((name . "<") (arity . n)) -// { -// int n = INT_MIN; -// while (x != cell_nil) -// { -// assert (TYPE (car (x)) == TNUMBER); -// if (VALUE (car (x)) <= n) return cell_f; -// n = VALUE (car (x)); -// x = cdr (x); -// } -// return cell_t; -// } +SCM +less_p (SCM x) ///((name . "<") (arity . n)) +{ + int n = INT_MIN; + while (x != cell_nil) + { + assert (TYPE (car (x)) == TNUMBER); + if (VALUE (car (x)) <= n) return cell_f; + n = VALUE (car (x)); + x = cdr (x); + } + return cell_t; +} SCM is_p (SCM x) ///((name . "=") (arity . n)) diff --git a/mes.c b/mes.c index fa794b87..25c08e2f 100644 --- a/mes.c +++ b/mes.c @@ -158,11 +158,17 @@ struct scm scm_vm_call_with_values2 = {TSPECIAL, "*vm-call-with-values2*",0}; struct scm scm_vm_call_with_current_continuation2 = {TSPECIAL, "*vm-call-with-current-continuation2*",0}; struct scm scm_vm_return = {TSPECIAL, "*vm-return*",0}; +struct scm scm_symbol_gnuc = {TSYMBOL, "%gnuc",0}; +struct scm scm_symbol_mesc = {TSYMBOL, "%mesc",0}; + struct scm scm_test = {TSYMBOL, "test",0}; + int g_free = 0; struct scm *g_cells; struct scm *g_news = 0; +SCM g_symbol_max; +bool g_debug = false; #include "mes.symbols.h" @@ -181,11 +187,13 @@ SCM r1 = 0; // param 1 SCM r2 = 0; // save 2+load/dump SCM r3 = 0; // continuation +#include "gc.h" #include "lib.h" #include "math.h" #include "mes.h" #include "posix.h" #include "reader.h" +#include "vector.h" #define CAR(x) g_cells[x].car #define CDR(x) g_cells[x].cdr @@ -362,6 +370,16 @@ error (SCM key, SCM x) assert (!"error"); } +SCM +cstring_to_list (char const* s) +{ + SCM p = cell_nil; + int i = strlen (s); + while (i--) + p = cons (MAKE_CHAR (s[i]), p); + return p; +} + SCM append2 (SCM x, SCM y) { @@ -874,16 +892,6 @@ apply (SCM f, SCM x, SCM a) ///((internal)) return eval_apply (); } -SCM -cstring_to_list (char const* s) -{ - SCM p = cell_nil; - int i = strlen (s); - while (i--) - p = cons (MAKE_CHAR (s[i]), p); - return p; -} - SCM make_symbol_ (SCM s) { @@ -954,325 +962,6 @@ acons (SCM key, SCM value, SCM alist) return cons (cons (key, value), alist); } -// temp MINI_MES lib -//posix.c -FILE *g_stdin; -int -getchar () -{ - return getc (g_stdin); -} - -int -ungetchar (int c) -{ - return ungetc (c, g_stdin); -} - -int -peekchar () -{ - int c = getchar (); - ungetchar (c); - return c; -} - -SCM -peek_byte () -{ - return MAKE_NUMBER (peekchar ()); -} - -SCM -read_byte () -{ - return MAKE_NUMBER (getchar ()); -} - -SCM -unread_byte (SCM i) -{ - ungetchar (VALUE (i)); - return i; -} - -SCM -write_byte (SCM x) ///((arity . n)) -{ - SCM c = car (x); - SCM p = cdr (x); - int fd = 1; - if (TYPE (p) == TPAIR && TYPE (car (p)) == TNUMBER) fd = VALUE (car (p)); - FILE *f = fd == 1 ? stdout : stderr; - assert (TYPE (c) == TNUMBER || TYPE (c) == TCHAR); - fputc (VALUE (c), f); - return c; -} - -char const* -string_to_cstring (SCM s) -{ - static char buf[1024]; - char *p = buf; - s = STRING(s); - while (s != cell_nil) - { - *p++ = VALUE (car (s)); - s = cdr (s); - } - *p = 0; - return buf; -} - -int g_depth; - -#define gputs(x) fputs(x, stdout) - -SCM -display_helper (SCM x, int cont, char* sep) -{ - gputs (sep); - if (g_depth == 0) return cell_unspecified; - //FIXME: - //g_depth--; - g_depth = g_depth - 1; - - // eputs ("\n"); - switch (TYPE (x)) - { - case TCHAR: - { - //puts ("\n"); - gputs ("#\\"); - putchar (VALUE (x)); - break; - } - case TFUNCTION: - { - gputs ("#"); - break; - } - case TMACRO: - { - gputs ("#"); - break; - } - case TNUMBER: - { - //gputs ("\n"); - gputs (itoa (VALUE (x))); - break; - } - case TPAIR: - { - if (!cont) gputs ("("); - if (x && x != cell_nil) display_ (CAR (x)); - if (CDR (x) && TYPE (CDR (x)) == TPAIR) - display_helper (CDR (x), 1, " "); - else if (CDR (x) && CDR (x) != cell_nil) - { - if (TYPE (CDR (x)) != TPAIR) - gputs (" . "); - display_ (CDR (x)); - } - if (!cont) gputs (")"); - break; - } - case TSPECIAL: -#if __NYACC__ - // FIXME - //{} - { - SCM t = CAR (x); - while (t && t != cell_nil) - { - putchar (VALUE (CAR (t))); - t = CDR (t); - } - break; - } -#endif - case TSTRING: -#if __NYACC__ - // FIXME - {} -#endif - case TSYMBOL: - { - SCM t = CAR (x); - while (t && t != cell_nil) - { - putchar (VALUE (CAR (t))); - t = CDR (t); - } - break; - } - default: - { - //gputs ("\n"); - gputs ("<"); - gputs (itoa (TYPE (x))); - gputs (":"); - gputs (itoa (x)); - gputs (">"); - break; - } - } - return 0; -} - -SCM -display_ (SCM x) -{ - g_depth = 5; - return display_helper (x, 0, ""); -} - -SCM -stderr_ (SCM x) -{ - SCM write; - if (TYPE (x) == TSTRING) - fprintf (stderr, string_to_cstring (x)); - else if ((write = assq_ref_env (cell_symbol_write, r0)) != cell_undefined) - apply (assq_ref_env (cell_symbol_display, r0), cons (x, cons (MAKE_NUMBER (2), cell_nil)), r0); - else if (TYPE (x) == TSPECIAL || TYPE (x) == TSTRING || TYPE (x) == TSYMBOL) - fprintf (stderr, string_to_cstring (x)); - else if (TYPE (x) == TNUMBER) - fprintf (stderr, "%d", VALUE (x)); - else - fprintf (stderr, "display: undefined\n"); - return cell_unspecified; -} - -//math.c -SCM -greater_p (SCM x) ///((name . ">") (arity . n)) -{ - int n = INT_MAX; - while (x != cell_nil) - { - assert (TYPE (car (x)) == TNUMBER); - if (VALUE (car (x)) >= n) return cell_f; - n = VALUE (car (x)); - x = cdr (x); - } - return cell_t; -} - -SCM -less_p (SCM x) ///((name . "<") (arity . n)) -{ - int n = INT_MIN; - while (x != cell_nil) - { - assert (TYPE (car (x)) == TNUMBER); - if (VALUE (car (x)) <= n) return cell_f; - n = VALUE (car (x)); - x = cdr (x); - } - return cell_t; -} - -// MINI_MES+ -SCM -make_vector (SCM n) -{ - int k = VALUE (n); - g_cells[tmp_num].value = TVECTOR; - SCM v = alloc (k); - SCM x = make_cell (tmp_num, k, v); - for (int i=0; i jam[%d]\n", g_free); - return g_stack; -} - // Environment setup SCM -gc_init_cells () +gc_init_cells () ///((internal)) { g_cells = (struct scm *)malloc (2*ARENA_SIZE*sizeof(struct scm)); g_cells[0].type = TVECTOR; @@ -1405,7 +987,7 @@ gc_init_cells () } SCM -gc_init_news () +gc_init_news () ///((internal)) { g_news = g_cells-1 + ARENA_SIZE; g_news[0].type = TVECTOR; @@ -1445,26 +1027,57 @@ mes_symbols () ///((internal)) a = acons (cell_symbol_begin, cell_begin, a); a = acons (cell_symbol_call_with_current_continuation, cell_call_with_current_continuation, a); a = acons (cell_symbol_sc_expand, cell_f, a); + +#if __GNUC__ + a = acons (cell_symbol_gnuc, cell_t, a); + a = acons (cell_symbol_mesc, cell_f, a); +#else + a = acons (cell_symbol_gnuc, cell_f, a); + a = acons (cell_symbol_mesc, cell_t, a); +#endif + a = acons (cell_closure, a, a); return a; } +#define gputs(x) fputs(x,stdout); + SCM mes_builtins (SCM a) ///((internal)) { #include "mes.i" -#include "lib.i" -#include "math.i" #include "posix.i" +#include "math.i" +#include "lib.i" #include "reader.i" +#include "vector.i" +#include "gc.i" +#include "gc.environment.i" #include "lib.environment.i" #include "math.environment.i" #include "mes.environment.i" #include "posix.environment.i" #include "reader.environment.i" +#include "vector.environment.i" + + if (g_debug) + { + gputs ("functions: "); + gputs (itoa (g_function)); + gputs ("\n"); + for (int i = 0; i < g_function; i++) + { + gputs ("["); + gputs (itoa (i)); + gputs ("]: "); + gputs (g_functions[i].name); + gputs ("\n"); + } + gputs ("\n"); + } return a; } @@ -1488,17 +1101,18 @@ mes_environment () ///((internal)) } FILE *g_stdin; -#include "lib.c" #include "math.c" #include "posix.c" +#include "lib.c" #include "reader.c" +#include "gc.c" +#include "vector.c" int main (int argc, char *argv[]) { #if __GNUC__ g_debug = getenv ("MES_DEBUG"); -#else #endif if (getenv ("MES_ARENA")) ARENA_SIZE = atoi (getenv ("MES_ARENA")); if (argc > 1 && !strcmp (argv[1], "--help")) return puts ("Usage: mes [--dump|--load] < FILE"); diff --git a/mlibc.c b/mlibc.c index e4442dd8..89d1d931 100644 --- a/mlibc.c +++ b/mlibc.c @@ -26,6 +26,7 @@ int open (char const *s, int mode); int read (int fd, void* buf, size_t n); void write (int fd, char const* s, int n); +#define O_RDONLY 0 #define INT_MIN -2147483648 #define INT_MAX 2147483647 @@ -239,6 +240,7 @@ getchar () i = ungetc_buf[ungetc_char--]; if (i < 0) i += 256; + return i; } diff --git a/module/language/c99/compiler.mes b/module/language/c99/compiler.mes index b715e912..0648bbc8 100644 --- a/module/language/c99/compiler.mes +++ b/module/language/c99/compiler.mes @@ -53,11 +53,12 @@ #:inc-dirs (string-split (getenv "C_INCLUDE_PATH") #\:) #:cpp-defs '( "__GNUC__=0" - "__MESCC__=1" - "__NYACC__=1" + "__MESC__=1" + "__NYACC__=1" ;; REMOVEME "STDIN=0" "STDOUT=1" "STDERR=2" + "O_RDONLY=0" "INT_MIN=-2147483648" "INT_MAX=2147483647" diff --git a/module/mes/display.mes b/module/mes/display.mes index 12db70db..31a0c5f8 100644 --- a/module/mes/display.mes +++ b/module/mes/display.mes @@ -94,7 +94,8 @@ (display "#" port)) - ((number? x) (display (number->string x) port)) + ((number? x) + (display (number->string x) port)) ((pair? x) (if (not cont?) (write-char #\( port)) (cond ((eq? (car x) '*circular*) diff --git a/module/mes/libc.mes b/module/mes/libc.mes index 4f575782..1c381805 100644 --- a/module/mes/libc.mes +++ b/module/mes/libc.mes @@ -91,6 +91,13 @@ getchar () ungetc_char = ungetc_char - 1; } if (i < 0) i += 256; + +#if 0 + puts (\"get: \"); + putchar (i); + puts (\"\n\"); +#endif + return i; } " diff --git a/module/mes/read-0-32.mo b/module/mes/read-0-32.mo deleted file mode 100644 index 1efbbfd798bfbebb1bc0ad4cfd827a505716dbf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83213 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 diff --git a/posix.c b/posix.c index 4e47b855..045eb1c4 100644 --- a/posix.c +++ b/posix.c @@ -18,40 +18,217 @@ * along with Mes. If not, see . */ +#if !MINI_MES #include -//MINI_MES -// SCM -// write_byte (SCM x) ///((arity . n)) -// { -// SCM c = car (x); -// SCM p = cdr (x); -// int fd = 1; -// if (TYPE (p) == TPAIR && TYPE (car (p)) == TNUMBER) fd = VALUE (car (p)); -// FILE *f = fd == 1 ? stdout : stderr; -// assert (TYPE (c) == TNUMBER || TYPE (c) == TCHAR); -// fputc (VALUE (c), f); -// return c; -// } +FILE *g_stdin; +int +getchar () +{ + return getc (g_stdin); +} +#endif -char const* string_to_cstring (SCM); +int +ungetchar (int c) +{ + return ungetc (c, g_stdin); +} -// SCM -// stderr_ (SCM x) -// { -// SCM write; -// if (TYPE (x) == TSTRING) -// fprintf (stderr, string_to_cstring (x)); -// else if ((write = assq_ref_env (cell_symbol_write, r0)) != cell_undefined) -// apply (assq_ref_env (cell_symbol_display, r0), cons (x, cons (MAKE_NUMBER (2), cell_nil)), r0); -// else if (TYPE (x) == TSPECIAL || TYPE (x) == TSTRING || TYPE (x) == TSYMBOL) -// fprintf (stderr, string_to_cstring (x)); -// else if (TYPE (x) == TNUMBER) -// fprintf (stderr, "%d", VALUE (x)); -// else -// fprintf (stderr, "display: undefined\n"); -// return cell_unspecified; -// } +int +peekchar () +{ + int c = getchar (); + ungetchar (c); + return c; +} + +SCM +peek_byte () +{ + return MAKE_NUMBER (peekchar ()); +} + +SCM +read_byte () +{ + return MAKE_NUMBER (getchar ()); +} + +SCM +unread_byte (SCM i) +{ + ungetchar (VALUE (i)); + return i; +} + +SCM +write_byte (SCM x) ///((arity . n)) +{ + SCM c = car (x); + SCM p = cdr (x); + int fd = 1; + if (TYPE (p) == TPAIR && TYPE (car (p)) == TNUMBER) fd = VALUE (car (p)); +#if !MES_MINI + FILE *f = fd == 1 ? stdout : stderr; + fputc (VALUE (c), f); +#else + char cc = VALUE (c); + write (1, (char*)&cc, fd); +#endif +#if __GNUC__ + assert (TYPE (c) == TNUMBER || TYPE (c) == TCHAR); +#endif + return c; +} + +char const* +string_to_cstring (SCM s) +{ + static char buf[1024]; + char *p = buf; + s = STRING(s); + while (s != cell_nil) + { + *p++ = VALUE (car (s)); + s = cdr (s); + } + *p = 0; + return buf; +} + +int g_depth; + +SCM +display_helper (SCM x, int cont, char* sep) +{ + gputs (sep); + if (g_depth == 0) return cell_unspecified; + //FIXME: + //g_depth--; + g_depth = g_depth - 1; + + // eputs ("\n"); + switch (TYPE (x)) + { + case TCHAR: + { + //gputs ("\n"); + gputs ("#\\"); + putchar (VALUE (x)); + break; + } + case TFUNCTION: + { + gputs ("#"); + break; + } + case TMACRO: + { + gputs ("#"); + break; + } + case TNUMBER: + { + //gputs ("\n"); + gputs (itoa (VALUE (x))); + break; + } + case TPAIR: + { + if (!cont) gputs ("("); + if (x && x != cell_nil) display_ (CAR (x)); + if (CDR (x) && TYPE (CDR (x)) == TPAIR) + display_helper (CDR (x), 1, " "); + else if (CDR (x) && CDR (x) != cell_nil) + { + if (TYPE (CDR (x)) != TPAIR) + gputs (" . "); + display_ (CDR (x)); + } + if (!cont) gputs (")"); + break; + } + case TSPECIAL: +#if __NYACC__ + // FIXME + //{} + { + SCM t = CAR (x); + while (t && t != cell_nil) + { + putchar (VALUE (CAR (t))); + t = CDR (t); + } + break; + } +#endif + case TSTRING: +#if __NYACC__ + // FIXME + {} +#endif + case TSYMBOL: + { + SCM t = CAR (x); + while (t && t != cell_nil) + { + putchar (VALUE (CAR (t))); + t = CDR (t); + } + break; + } + default: + { + //gputs ("\n"); + gputs ("<"); + gputs (itoa (TYPE (x))); + gputs (":"); + gputs (itoa (x)); + gputs (">"); + break; + } + } + return 0; +} + +SCM +display_ (SCM x) +{ + g_depth = 5; + return display_helper (x, 0, ""); +} + +SCM +stderr_ (SCM x) +{ + SCM write; + if (TYPE (x) == TSTRING) + eputs (string_to_cstring (x)); +#if __GNUC__ + else if ((write = assq_ref_env (cell_symbol_write, r0)) != cell_undefined) + apply (assq_ref_env (cell_symbol_display, r0), cons (x, cons (MAKE_NUMBER (2), cell_nil)), r0); +#endif + else if (TYPE (x) == TSPECIAL || TYPE (x) == TSTRING || TYPE (x) == TSYMBOL) + eputs (string_to_cstring (x)); + else if (TYPE (x) == TNUMBER) + eputs (itoa (VALUE (x))); + else + eputs ("core:stderr: display undefined\n"); + return cell_unspecified; +} SCM getenv_ (SCM s) ///((name . "getenv")) @@ -60,56 +237,6 @@ getenv_ (SCM s) ///((name . "getenv")) return p ? MAKE_STRING (cstring_to_list (p)) : cell_f; } -// MINI_MES -// int -// getchar () -// { -// return getc (g_stdin); -// } - -// int -// ungetchar (int c) -// { -// return ungetc (c, g_stdin); -// } - -// int -// peekchar () -// { -// int c = getchar (); -// ungetchar (c); -// return c; -// } - -// SCM -// peek_byte () -// { -// return MAKE_NUMBER (peekchar ()); -// } - -// SCM -// read_byte () -// { -// return MAKE_NUMBER (getchar ()); -// } - -// SCM -// unread_byte (SCM i) -// { -// ungetchar (VALUE (i)); -// return i; -// } - -SCM -force_output (SCM p) ///((arity . n)) -{ - int fd = 1; - if (TYPE (p) == TPAIR && TYPE (car (p)) == TNUMBER) fd = VALUE (car (p)); - FILE *f = fd == 1 ? stdout : stderr; - fflush (f); - return cell_unspecified; -} - SCM open_input_file (SCM file_name) { @@ -128,3 +255,13 @@ set_current_input_port (SCM port) g_stdin = VALUE (port) ? fdopen (VALUE (port), "r") : stdin; return current_input_port (); } + +SCM +force_output (SCM p) ///((arity . n)) +{ + int fd = 1; + if (TYPE (p) == TPAIR && TYPE (car (p)) == TNUMBER) fd = VALUE (car (p)); + FILE *f = fd == 1 ? stdout : stderr; + fflush (f); + return cell_unspecified; +} diff --git a/scaffold/b-0.mes b/scaffold/b-0.mes new file mode 100644 index 00000000..52f2e810 --- /dev/null +++ b/scaffold/b-0.mes @@ -0,0 +1,15 @@ +;;; -*-scheme-*- +(define (newline) (core:display "\n")) +(core:display "b-00\n") +(define save (current-input-port)) +(core:display "save=")(core:display save)(newline) +(core:display "b-0111\n") +(set-current-input-port (open-input-file "scaffold/t-0.mes")) +;;(set-current-input-port (open-input-file "mes/t-0.mes")) +(core:display "ipp=")(core:display (current-input-port))(newline) +(core:display "b-02\n") +(primitive-load) +(core:display "b-03\n") +(set-current-input-port save) +(core:display "b-04\n") +"42\n" diff --git a/scaffold/mini-mes.c b/scaffold/mini-mes.c index def353aa..b2fc0b2a 100644 --- a/scaffold/mini-mes.c +++ b/scaffold/mini-mes.c @@ -23,7 +23,7 @@ #endif #define assert(x) ((x) ? (void)0 : assert_fail (#x)) -#if __MESCC__ +#if __MESC__ //void *g_malloc_base = 0; char *g_malloc_base = 0; // int ungetc_char = -1; @@ -46,7 +46,7 @@ char *g_malloc_base = 0; //int ARENA_SIZE = 4000000; -int ARENA_SIZE = 100000000; +int ARENA_SIZE = 1000000000; char *arena = 0; typedef int SCM; @@ -165,6 +165,9 @@ struct scm scm_vm_call_with_values2 = {TSPECIAL, "*vm-call-with-values2*",0}; struct scm scm_vm_call_with_current_continuation2 = {TSPECIAL, "*vm-call-with-current-continuation2*",0}; struct scm scm_vm_return = {TSPECIAL, "*vm-return*",0}; +struct scm scm_symbol_gnuc = {TSYMBOL, "%gnuc",0}; +struct scm scm_symbol_mesc = {TSYMBOL, "%mesc",0}; + struct scm scm_test = {TSYMBOL, "test",0}; #include "mini-mes.symbols.h" @@ -383,6 +386,20 @@ assert_defined (SCM x, SCM e) ///((internal)) return e; } +SCM +cstring_to_list (char const* s) +{ + char *x = s; + SCM p = cell_nil; + int i = strlen (s); + while (i--) + { + p = cons (MAKE_CHAR (s[i]), p); + x++; + } + return p; +} + SCM check_formals (SCM f, SCM formals, SCM args) ///((internal)) { @@ -632,7 +649,7 @@ eval_apply () case cell_vm_eval2: goto eval2; case cell_vm_macro_expand: goto macro_expand; case cell_vm_begin: goto begin; - ///case cell_vm_begin_read_input_file: goto begin_read_input_file; + case cell_vm_begin_read_input_file: goto begin_read_input_file; case cell_vm_begin2: goto begin2; case cell_vm_if: goto vm_if; case cell_vm_if_expr: goto if_expr; @@ -1066,35 +1083,13 @@ lookup_ (SCM s, SCM a) return x ? x : make_symbol_ (s); } -SCM -cstring_to_list (char const* s) -{ - char *x = s; - SCM p = cell_nil; - int i = strlen (s); - while (i--) - { - p = cons (MAKE_CHAR (s[i]), p); - x++; - } - return p; -} - SCM acons (SCM key, SCM value, SCM alist) { return cons (cons (key, value), alist); } - -// MINI_MES: temp-lib - -// int -// getchar () -// { -// return getc (g_stdin); -// } - +// Posix int ungetchar (int c) { @@ -1145,6 +1140,24 @@ write_byte (SCM x) ///((arity . n)) return c; } +char string_to_cstring_buf[1024]; +char const* +string_to_cstring (SCM s) +{ + //static char buf[1024]; + //char *p = buf; + char *p = string_to_cstring_buf; + s = STRING(s); + while (s != cell_nil) + { + *p++ = VALUE (car (s)); + s = cdr (s); + } + *p = 0; + //return buf; + return string_to_cstring_buf; +} + int g_depth; SCM @@ -1226,7 +1239,16 @@ display_helper (SCM x, int cont, char* sep) case TSTRING: #if __NYACC__ // FIXME - {} + //{} + { + SCM t = CAR (x); + while (t && t != cell_nil) + { + putchar (VALUE (CAR (t))); + t = CDR (t); + } + break; + } #endif case TSYMBOL: { @@ -1259,6 +1281,281 @@ display_ (SCM x) return display_helper (x, 0, ""); } +SCM +stderr_ (SCM x) +{ + SCM write; + if (TYPE (x) == TSTRING) + eputs (string_to_cstring (x)); +#if __GNUC__ + else if ((write = assq_ref_env (cell_symbol_write, r0)) != cell_undefined) + apply (assq_ref_env (cell_symbol_display, r0), cons (x, cons (MAKE_NUMBER (2), cell_nil)), r0); +#endif + else if (TYPE (x) == TSPECIAL || TYPE (x) == TSTRING || TYPE (x) == TSYMBOL) + eputs (string_to_cstring (x)); + else if (TYPE (x) == TNUMBER) + eputs (itoa (VALUE (x))); + else + eputs ("core:stderr: display undefined\n"); + return cell_unspecified; +} + +SCM +getenv_ (SCM s) ///((name . "getenv")) +{ +#if 0 + char *p = getenv (string_to_cstring (s)); + return p ? MAKE_STRING (cstring_to_list (p)) : cell_f; +#else + return cell_t; +#endif +} + +SCM +open_input_file (SCM file_name) +{ + return MAKE_NUMBER (open (string_to_cstring (file_name), O_RDONLY)); + // char *s = string_to_cstring (file_name); + // int x = open (s, 0); + // return MAKE_NUMBER (x); +} + +SCM +current_input_port () +{ + return MAKE_NUMBER (g_stdin); +} + +SCM +set_current_input_port (SCM port) +{ + g_stdin = VALUE (port) ? VALUE (port) : STDIN; + return current_input_port (); +} + +SCM +force_output (SCM p) ///((arity . n)) +{ +#if 0 + //FIXME + int fd = 1; + if (TYPE (p) == TPAIR && TYPE (car (p)) == TNUMBER) fd = VALUE (car (p)); + FILE *f = fd == 1 ? stdout : stderr; + fflush (f); +#endif + return cell_unspecified; +} + +// Math +SCM +greater_p (SCM x) ///((name . ">") (arity . n)) +{ + int n = INT_MAX; + while (x != cell_nil) + { + assert (TYPE (car (x)) == TNUMBER); + if (VALUE (car (x)) >= n) return cell_f; + n = VALUE (car (x)); + x = cdr (x); + } + return cell_t; +} + +SCM +less_p (SCM x) ///((name . "<") (arity . n)) +{ + int n = INT_MIN; + while (x != cell_nil) + { + assert (TYPE (car (x)) == TNUMBER); +#if __MESC__ + //FIXME __GNUC__ + if (n == INT_MIN); + else +#endif + if (VALUE (car (x)) <= n) return cell_f; + n = VALUE (car (x)); + x = cdr (x); + } + return cell_t; +} + +SCM +is_p (SCM x) ///((name . "=") (arity . n)) +{ + if (x == cell_nil) return cell_t; + assert (TYPE (car (x)) == TNUMBER); + int n = VALUE (car (x)); + x = cdr (x); + while (x != cell_nil) + { + if (VALUE (car (x)) != n) return cell_f; + x = cdr (x); + } + return cell_t; +} + +SCM +minus (SCM x) ///((name . "-") (arity . n)) +{ + SCM a = car (x); + assert (TYPE (a) == TNUMBER); + int n = VALUE (a); + x = cdr (x); + if (x == cell_nil) + n = -n; + while (x != cell_nil) + { + assert (TYPE (car (x)) == TNUMBER); +#if __GNUC__ + n -= VALUE (car (x)); +#else + n = n - VALUE (car (x)); +#endif + x = cdr (x); + } + return MAKE_NUMBER (n); +} + +SCM +plus (SCM x) ///((name . "+") (arity . n)) +{ + int n = 0; + while (x != cell_nil) + { + assert (TYPE (car (x)) == TNUMBER); +#if __GNUC__ + n += VALUE (car (x)); +#else + n = n + VALUE (car (x)); +#endif + x = cdr (x); + } + return MAKE_NUMBER (n); +} + +SCM +divide (SCM x) ///((name . "/") (arity . n)) +{ + int n = 1; + if (x != cell_nil) { + assert (TYPE (car (x)) == TNUMBER); + n = VALUE (car (x)); + x = cdr (x); + } + while (x != cell_nil) + { + assert (TYPE (car (x)) == TNUMBER); +#if __GNUC__ + n /= VALUE (car (x)); +#else + n = n / VALUE (car (x)); +#endif + x = cdr (x); + } + return MAKE_NUMBER (n); +} + +SCM +modulo (SCM a, SCM b) +{ + assert (TYPE (a) == TNUMBER); + assert (TYPE (b) == TNUMBER); + int x = VALUE (a); + while (x < 0) x += VALUE (b); + return MAKE_NUMBER (x % VALUE (b)); +} + +SCM +multiply (SCM x) ///((name . "*") (arity . n)) +{ + int n = 1; + while (x != cell_nil) + { + assert (TYPE (car (x)) == TNUMBER); +#if __GNUC__ + n *= VALUE (car (x)); +#else + n = n * VALUE (car (x)); +#endif + x = cdr (x); + } + return MAKE_NUMBER (n); +} + +SCM +logior (SCM x) ///((arity . n)) +{ + int n = 0; + while (x != cell_nil) + { + assert (TYPE (car (x)) == TNUMBER); +#if __GNUC__ + n |= VALUE (car (x)); +#else + puts ("FIXME: logior\n"); + //FIXME + //n = n | VALUE (car (x)); +#endif + x = cdr (x); + } + return MAKE_NUMBER (n); +} + +SCM +ash (SCM n, SCM count) +{ + assert (TYPE (n) == TNUMBER); + assert (TYPE (count) == TNUMBER); + int cn = VALUE (n); + int ccount = VALUE (count); +#if __GNUC__ + return MAKE_NUMBER ((ccount < 0) ? cn >> -ccount : cn << ccount); +#else + //FIXME + assert (ccount >= 0); + return MAKE_NUMBER (cn << ccount); +#endif +} + +// Lib [rest of] + +SCM +exit_ (SCM x) ///((name . "exit")) +{ + assert (TYPE (x) == TNUMBER); + exit (VALUE (x)); +} + +SCM +append (SCM x) ///((arity . n)) +{ + if (x == cell_nil) return cell_nil; + if (cdr (x) == cell_nil) return car (x); + return append2 (car (x), append (cdr (x))); +} + +SCM +values (SCM x) ///((arity . n)) +{ + SCM v = cons (0, x); + TYPE (v) = TVALUES; + return v; +} + +SCM +arity_ (SCM x) +{ + assert (TYPE (x) == TFUNCTION); + return MAKE_NUMBER (FUNCTION (x).arity); +} + +SCM +xassq (SCM x, SCM a) ///for speed in core only +{ + while (a != cell_nil && x != CDAR (a)) a = CDR (a); + return a != cell_nil ? CAR (a) : cell_f; +} // Jam Collector SCM g_symbol_max; @@ -1319,6 +1616,15 @@ mes_symbols () ///((internal)) a = acons (cell_symbol_begin, cell_begin, a); a = acons (cell_symbol_call_with_current_continuation, cell_call_with_current_continuation, a); a = acons (cell_symbol_sc_expand, cell_f, a); + +#if __GNUC__ + a = acons (cell_symbol_gnuc, cell_t, a); + a = acons (cell_symbol_mesc, cell_f, a); +#else + a = acons (cell_symbol_gnuc, cell_f, a); + a = acons (cell_symbol_mesc, cell_t, a); +#endif + a = acons (cell_closure, a, a); return a; @@ -1377,104 +1683,42 @@ bload_env (SCM a) ///((internal)) g_symbols = r1; g_stdin = STDIN; r0 = mes_builtins (r0); -#if 1 - puts ("symbols: "); - SCM s = g_symbols; - while (s && s != cell_nil) { - display_ (CAR (s)); - puts (" "); - s = CDR (s); - } - puts ("\n"); - puts ("functions: "); - puts (itoa (g_function)); - puts ("\n"); - for (int i = 0; i < g_function; i++) + +#if __GNUC__ + set_env_x (cell_symbol_gnuc, cell_t, r0); + set_env_x (cell_symbol_mesc, cell_f, r0); +#else + set_env_x (cell_symbol_gnuc, cell_f, r0); + set_env_x (cell_symbol_mesc, cell_t, r0); +#endif + + if (g_debug) { - puts ("["); - puts (itoa (i)); - puts ("]: "); - puts (g_functions[i].name); + puts ("symbols: "); + SCM s = g_symbols; + while (s && s != cell_nil) { + display_ (CAR (s)); + puts (" "); + s = CDR (s); + } + puts ("\n"); + puts ("functions: "); + puts (itoa (g_function)); + puts ("\n"); + for (int i = 0; i < g_function; i++) + { + puts ("["); + puts (itoa (i)); + puts ("]: "); + puts (g_functions[i].name); + puts ("\n"); + } + display_ (r0); puts ("\n"); } - display_ (r0); - puts ("\n"); -#endif return r2; } -char string_to_cstring_buf[1024]; -char const* -string_to_cstring (SCM s) -{ - //static char buf[1024]; - //char *p = buf; - char *p = string_to_cstring_buf; - s = STRING(s); - while (s != cell_nil) - { - *p++ = VALUE (car (s)); - s = cdr (s); - } - *p = 0; - //return buf; - return string_to_cstring_buf; -} - -SCM -stderr_ (SCM x) -{ - //SCM write; -#if __NYACC__ || FIXME_NYACC - if (TYPE (x) == TSTRING) -// #else -// if (TYPE (x) == STRING) -#endif - eputs (string_to_cstring (x)); - // else if ((write = assq_ref_env (cell_symbol_write, r0)) != cell_undefined) - // apply (assq_ref_env (cell_symbol_display, r0), cons (x, cons (MAKE_NUMBER (2), cell_nil)), r0); -#if __NYACC__ || FIXME_NYACC - else if (TYPE (x) == TSPECIAL || TYPE (x) == TSTRING || TYPE (x) == TSYMBOL) -// #else -// else if (TYPE (x) == SPECIAL || TYPE (x) == STRING || TYPE (x) == SYMBOL) -#endif - eputs (string_to_cstring (x)); - else if (TYPE (x) == TNUMBER) - eputs (itoa (VALUE (x))); - else - eputs ("core:stderr: display undefined\n"); - return cell_unspecified; -} - -//math.c -SCM -greater_p (SCM x) ///((name . ">") (arity . n)) -{ - int n = INT_MAX; - while (x != cell_nil) - { - assert (TYPE (car (x)) == TNUMBER); - if (VALUE (car (x)) >= n) return cell_f; - n = VALUE (car (x)); - x = cdr (x); - } - return cell_t; -} - -SCM -less_p (SCM x) ///((name . "<") (arity . n)) -{ - int n = INT_MIN; - while (x != cell_nil) - { - assert (TYPE (car (x)) == TNUMBER); - if (VALUE (car (x)) <= n) return cell_f; - n = VALUE (car (x)); - x = cdr (x); - } - return cell_t; -} - int main (int argc, char *argv[]) { @@ -1502,9 +1746,12 @@ main (int argc, char *argv[]) #endif push_cc (r2, cell_unspecified, r0, cell_unspecified); - eputs ("program: "); - display_ (r1); - eputs ("\n"); + if (g_debug) + { + eputs ("program: "); + display_ (r1); + eputs ("\n"); + } r3 = cell_vm_begin; r1 = eval_apply (); display_ (r1); diff --git a/scaffold/t-0.mes b/scaffold/t-0.mes new file mode 100644 index 00000000..075757f3 --- /dev/null +++ b/scaffold/t-0.mes @@ -0,0 +1,2 @@ +;;; -*-scheme-*- +(core:display "t00\n") diff --git a/scaffold/t.c b/scaffold/t.c index 86ffd739..1fd12f5c 100644 --- a/scaffold/t.c +++ b/scaffold/t.c @@ -184,6 +184,10 @@ math_test () i += 48; putchar (i); puts ("\n"); + + puts ("t: 3*4="); + i = 3 * 4; + if (i!=12) return 1; return read_test (); } diff --git a/vector.c b/vector.c new file mode 100644 index 00000000..abbeba3a --- /dev/null +++ b/vector.c @@ -0,0 +1,90 @@ +/* -*-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 . + */ + +SCM +make_vector (SCM n) +{ + int k = VALUE (n); + g_cells[tmp_num].value = TVECTOR; + SCM v = alloc (k); + SCM x = make_cell (tmp_num, k, v); + for (int i=0; i