core: Support keywords.
authorJan Nieuwenhuizen <janneke@gnu.org>
Fri, 16 Dec 2016 22:30:33 +0000 (23:30 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Fri, 16 Dec 2016 22:30:33 +0000 (23:30 +0100)
* display.c (display): Handle keyword.
* mes.c (type_t): Add KEYWORD.
  (eq_p): Handle it.
  (make_keyword): New function.
* reader.c (lookup): Use it.
* type.c (keyword_p): New function.
* NEWS: Update.

NEWS
display.c
mes.c
reader.c
string.c
type.c

diff --git a/NEWS b/NEWS
index aeda4e79f7c3e83704a95c5b5cee25f0f4c09fbc..36449e0f16563bdaf1617355d3d52c474ed2c9e7 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -16,6 +16,8 @@ Please send Mes bug reports to janneke@gnu.org.
 The C-reader needs only support reading of words and lists
 (s-expressions), line-comments.  Quoting, characters, strings,
 block-comments are all handled by the Scheme reader later.
+** Language
+*** Keywords are supported.
 * Changes in 0.3 since 0.2
 ** Core
 *** Number-based rather than pointer-based cells.
index 4c8567219a85f5ea5752174de01167d59e2b1d22..575b5bcd7bab605fed75a0e930ca8db0335efe75 100644 (file)
--- a/display.c
+++ b/display.c
@@ -127,6 +127,8 @@ display_helper (FILE* f, SCM x, bool cont, char const *sep, bool quote)
         break;
       }
     case BROKEN_HEART: fprintf (f, "<3"); break;
+    case KEYWORD:
+      fprintf (f, "#:");
     default:
       if (STRING (x))
         {
diff --git a/mes.c b/mes.c
index 7aaa70e70ad3c3092b5a191fcb45eba6bbb636f5..fdb66ca5af1f81a104e73cc49336edb1c858ac46 100644 (file)
--- a/mes.c
+++ b/mes.c
@@ -44,7 +44,7 @@ int MAX_ARENA_SIZE = 20000000;
 int GC_SAFETY = 100;
 
 typedef int SCM;
-enum type_t {CHAR, FUNCTION, MACRO, NUMBER, PAIR, SPECIAL, STRING, SYMBOL, REF, VALUES, VECTOR, BROKEN_HEART};
+enum type_t {CHAR, FUNCTION, KEYWORD, MACRO, NUMBER, PAIR, SPECIAL, STRING, SYMBOL, REF, VALUES, VECTOR, BROKEN_HEART};
 typedef SCM (*function0_t) (void);
 typedef SCM (*function1_t) (SCM);
 typedef SCM (*function2_t) (SCM, SCM);
@@ -250,6 +250,8 @@ SCM
 eq_p (SCM x, SCM y)
 {
   return (x == y
+          || ((TYPE (x) == KEYWORD && TYPE (y) == KEYWORD
+               && STRING (x) == STRING (y)))
           || (TYPE (x) == CHAR && TYPE (y) == CHAR
               && VALUE (x) == VALUE (y))
           || (TYPE (x) == NUMBER && TYPE (y) == NUMBER
@@ -676,6 +678,15 @@ make_function (SCM name, SCM id, SCM arity)
   return make_cell (tmp_num3, name, tmp_num4);
 }
 
+SCM
+make_keyword (SCM s)
+{
+  SCM x = internal_lookup_symbol (s);
+  x = x ? x : internal_make_symbol (s);
+  g_cells[tmp_num].value = KEYWORD;
+  return make_cell (tmp_num, STRING (x), 0);
+}
+
 SCM
 make_macro (SCM name, SCM x)
 {
@@ -932,7 +943,8 @@ gc_loop (SCM scan)
 {
   while (scan < g_free.value)
     {
-      if (NTYPE (scan) == MACRO
+      if (NTYPE (scan) == KEYWORD
+          || NTYPE (scan) == MACRO
           || NTYPE (scan) == PAIR
           || NTYPE (scan) == REF
           || scan == 1 // null
index 2e4ad091c7d5da16a0369154c44bc8f4fcf679ee..47d1b2467100487f750475fcddb91fc6f626add4 100644 (file)
--- a/reader.c
+++ b/reader.c
@@ -224,6 +224,8 @@ lookup (SCM s, SCM a)
     if (p == cell_nil) return make_number (n * sign);
   }
 
+  if (VALUE (car (s)) == '#' && VALUE (cadr (s)) == ':') return make_keyword (cddr (s));
+
   SCM x = internal_lookup_symbol (s);
   if (x) return x;
 
index c02b22cc62fcfc3d6a4ba0adc512f51cba8fa90f..36c27816381fd4d466ae6a78eade536cd9bf651b 100644 (file)
--- a/string.c
+++ b/string.c
@@ -110,3 +110,17 @@ symbol_to_string (SCM x)
   assert (TYPE (x) == SYMBOL);
   return make_string (STRING (x));
 }
+
+SCM
+keyword_to_symbol (SCM x)
+{
+  assert (TYPE (x) == KEYWORD);
+  return make_symbol (STRING (x));
+}
+
+SCM
+symbol_to_keyword (SCM x)
+{
+  assert (TYPE (x) == SYMBOL);
+  return make_keyword (STRING (x));
+}
diff --git a/type.c b/type.c
index 50b00673f7018f68df0d222fed9104e30152ff6c..ca28387ae520145fb38b307492617afa2eef4aba 100644 (file)
--- a/type.c
+++ b/type.c
@@ -26,6 +26,12 @@ char_p (SCM x)
   return TYPE (x) == CHAR ? cell_t : cell_f;
 }
 
+SCM
+keyword_p (SCM x)
+{
+  return TYPE (x) == KEYWORD ? cell_t : cell_f;
+}
+
 SCM
 macro_p (SCM x)
 {