From 89b4f093f98040f311f9581560d7254b14faa091 Mon Sep 17 00:00:00 2001
From: Simon Brooke <simon@journeyman.cc>
Date: Sun, 15 Oct 2017 15:14:34 +0100
Subject: [PATCH] Fixed bug which caused reader to infinite loop if symbol
 contained non-alnum.

---
 src/init.c | 3 +++
 src/read.c | 7 ++++++-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/init.c b/src/init.c
index d39e707..ac811c3 100644
--- a/src/init.c
+++ b/src/init.c
@@ -89,8 +89,11 @@ int main( int argc, char *argv[] ) {
     bind_function( "type", &lisp_type );
 
     bind_function( "add", &lisp_add );
+    bind_function( "+", &lisp_add );
     bind_function( "multiply", &lisp_multiply );
+    bind_function( "*", &lisp_multiply );
     bind_function( "subtract", &lisp_subtract );
+    bind_function( "-", &lisp_subtract );
 
     /*
      * primitive special forms 
diff --git a/src/read.c b/src/read.c
index 92f9f52..08e37f1 100644
--- a/src/read.c
+++ b/src/read.c
@@ -20,6 +20,7 @@
 #include "consspaceobject.h"
 #include "integer.h"
 #include "intern.h"
+#include "print.h"
 #include "read.h"
 #include "real.h"
 
@@ -194,7 +195,7 @@ struct cons_pointer read_symbol( FILE * input, wint_t initial ) {
         ungetwc( initial, input );
         break;
     default:
-        if ( iswalnum( initial ) ) {
+        if ( iswprint( initial ) && ! iswblank( initial ) ) {
             result =
                 make_symbol( initial, read_symbol( input, fgetwc( input ) ) );
         } else {
@@ -206,6 +207,10 @@ struct cons_pointer read_symbol( FILE * input, wint_t initial ) {
         }
         break;
     }
+    
+    fputws(L"Read symbol '", stderr);
+    print(stderr, result);
+    fputws(L"'\n", stderr);
 
     return result;
 }