mes.c: when reading `EOF', defer read control to program.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 24 Jul 2016 16:28:45 +0000 (18:28 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sun, 24 Jul 2016 16:28:45 +0000 (18:28 +0200)
GNUmakefile
mes.c
scm.mes

index 1db5cf968586e54f75cbed3371852ce91592f85b..d151941cd61bcfdc4a0e307498c50911995567f6 100644 (file)
@@ -84,8 +84,7 @@ record: all
 
 
 paren: all
-       cat scm.mes syntax.mes lib/srfi/srfi-0.scm lib/record.mes lib/record.scm lib/srfi/srfi-9.scm lib/lalr.mes lib/lalr.scm paren.scm | ./mes
-#      #echo '___P((()))'
+       echo -e 'EOF\n___P((()))' | cat scm.mes syntax.mes lib/srfi/srfi-0.scm lib/record.mes lib/record.scm lib/srfi/srfi-9.scm lib/lalr.mes lib/lalr.scm paren.scm - | ./mes
 
 paren.test: lib/lalr.scm paren.scm
        cat $^ > $@
diff --git a/mes.c b/mes.c
index faa231ed9d6e177ef0d3e1ec39265e309df56b8b..205cad553dfd9297b3b25528d21459e9d2684167 100644 (file)
--- a/mes.c
+++ b/mes.c
@@ -738,6 +738,10 @@ lookup (char *x, scm *a)
   if (*x == '#' && *(x+1) == ',' && *(x+2) == '@') return &symbol_unsyntax_splicing;
   if (*x == '#' && *(x+1) == ',') return &symbol_unsyntax;
 
+  if (!strcmp (x, "EOF")) {
+    fprintf (stderr, "mes: got EOF\n");
+    return &scm_nil; // `EOF': eval program, which may read stdin
+  }
   return make_symbol (x);
 }
 
@@ -921,13 +925,13 @@ peek_char () //int
 }
 
 scm*
-builtin_getchar ()
+builtin_peek_char ()
 {
-  return make_number (getchar ());
+  return make_char (peek_char ());
 }
 
-scm*
-builtin_peek_char ()
+scm *
+read_char ()
 {
   return make_char (getchar ());
 }
@@ -990,8 +994,8 @@ readword (int c, char* w, scm *a)
      && !w) {char buf[3] = "#"; buf[1] = getchar (); return cons (lookup (buf, a),
                           cons (readword (getchar (), w, a),
                                 &scm_nil));}
-   if (c == ';') {readcomment (c); return readword ('\n', w, a);}
-  if (c == '#' && peek_char () == '\\') {getchar (); return read_char ();}
+  if (c == ';') {readcomment (c); return readword ('\n', w, a);}
+  if (c == '#' && peek_char () == '\\') {getchar (); return read_character ();}
   if (c == '#' && !w && peek_char () == '(') {getchar (); return list_to_vector (readlist (a));}
   if (c == '#' && peek_char () == '(') {ungetchar (c); return lookup (w, a);}
   if (c == '#' && peek_char () == '!') {getchar (); readblock (getchar ()); return readword (getchar (), w, a);}
@@ -1001,7 +1005,7 @@ readword (int c, char* w, scm *a)
 }
 
 scm *
-read_char ()
+read_character ()
 {
   int c = getchar ();
   if (c >= '0' && c <= '7'
diff --git a/scm.mes b/scm.mes
index 7bcff27dcc5763cfe9485fb78445356a0ec975e1..0bbd4a39eef922c4d9f6a860c613dbd2d7230bc8 100755 (executable)
--- a/scm.mes
+++ b/scm.mes
       (append (reverse (cdr lst)) (cons (car lst) '()))))
 
 (define (eof-object? x)
-  (and (number? x) (= x -1)))
+  (or (and (number? x) (= x -1))
+      (and (char? x) (eof-object? (char->integer x)))))
 
 (define (char=? x y)
   (and (char? x) (char? y)