<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -77,6 +77,8 @@ extern dfsch_type_t dfsch_writer_state_type;
 extern dfsch_type_t dfsch_slot_accessor_type;
 #define DFSCH_SLOT_ACCESSOR_TYPE (&amp;dfsch_slot_accessor_type)
 
+extern dfsch_type_t dfsch_package_type;
+#define DFSCH_PACKAGE_TYPE (&amp;dfsch_package_type)
 
 typedef struct dfsch_primitive_t {
   dfsch_type_t* type;
@@ -405,8 +407,16 @@ typedef struct dfsch_pair_t {
 #define DFSCH_ASSERT_PAIR(p)                                            \
   (DFSCH_PAIR_P((p)) ? (p) : dfsch_assert_instance((p), DFSCH_PAIR_TYPE))
 
+typedef struct dfsch_package_t dfsch_package_t;
+
+extern dfsch_package_t dfsch_dfsch_package;
+#define DFSCH_DFSCH_PACKAGE (&amp;dfsch_dfsch_package)
+extern dfsch_package_t dfsch_dfsch_user_package;
+#define DFSCH_DFSCH_USER_PACKAGE (&amp;dfsch_dfsch_user_package)
+
 typedef struct dfsch__symbol_t{
-  char *data;
+  dfsch_package_t* package;
+  char *name;
   DFSCH_ALIGN8_DUMMY
 } DFSCH_ALIGN8_ATTR dfsch__symbol_t;
 </diff>
      <filename>dfsch/types.h</filename>
    </modified>
    <modified>
      <diff>@@ -467,8 +467,8 @@ dfsch_type_t dfsch_pair_type = {
 static void symbol_write(object_t* o, dfsch_writer_state_t* state){
   symbol_t* s;
   s = DFSCH_TAG_REF(o);
-  if (s-&gt;data){
-    dfsch_write_string(state, s-&gt;data);
+  if (s-&gt;name){
+    dfsch_write_string(state, s-&gt;name);
   } else {
     dfsch_write_string(state, dfsch_saprintf(&quot;#&lt;gensym %p&gt;&quot;, o)); 
   }
@@ -1543,28 +1543,43 @@ static size_t string_hash(char* string){
   return tmp &amp; (HASH_SIZE - 1); 
 }
 
+struct dfsch_package_t {
+  dfsch_type_t* type;
+};
+
+dfsch_package_t dfsch_dfsch_package = {
+  .type = DFSCH_PACKAGE_TYPE
+};
+dfsch_package_t dfsch_dfsch_user_package = {
+  .type = DFSCH_PACKAGE_TYPE
+};
+
+dfsch_type_t dfsch_package_type = {
+  .type = DFSCH_STANDARD_TYPE
+};
+
 static hash_entry_t*  global_symbol_hash[HASH_SIZE];
 static unsigned int gsh_init = 0;
 static pthread_mutex_t symbol_lock = PTHREAD_MUTEX_INITIALIZER;
 dfsch__symbol_t dfsch__static_symbols[] = {
-  {&quot;true&quot;},
-  {&quot;quote&quot;},
-  {&quot;quasiquote&quot;},
-  {&quot;unquote&quot;},
-  {&quot;unquote-splicing&quot;},
-  {&quot;else&quot;},
-  {&quot;=&gt;&quot;},
-  {&quot;&amp;optional&quot;},
-  {&quot;&amp;key&quot;},
-  {&quot;&amp;rest&quot;},
-  {&quot;&amp;body&quot;},
-  {&quot;&amp;allow-other-keys&quot;},
-  {&quot;&amp;environment&quot;},
-  {&quot;&amp;whole&quot;},
-  {&quot;&amp;aux&quot;},
-  {&quot;before&quot;},
-  {&quot;after&quot;},
-  {&quot;around&quot;},
+  {DFSCH_DFSCH_PACKAGE, &quot;true&quot;},
+  {DFSCH_DFSCH_PACKAGE, &quot;quote&quot;},
+  {DFSCH_DFSCH_PACKAGE, &quot;quasiquote&quot;},
+  {DFSCH_DFSCH_PACKAGE, &quot;unquote&quot;},
+  {DFSCH_DFSCH_PACKAGE, &quot;unquote-splicing&quot;},
+  {DFSCH_DFSCH_PACKAGE, &quot;else&quot;},
+  {DFSCH_DFSCH_PACKAGE, &quot;=&gt;&quot;},
+  {DFSCH_DFSCH_PACKAGE, &quot;&amp;optional&quot;},
+  {DFSCH_DFSCH_PACKAGE, &quot;&amp;key&quot;},
+  {DFSCH_DFSCH_PACKAGE, &quot;&amp;rest&quot;},
+  {DFSCH_DFSCH_PACKAGE, &quot;&amp;body&quot;},
+  {DFSCH_DFSCH_PACKAGE, &quot;&amp;allow-other-keys&quot;},
+  {DFSCH_DFSCH_PACKAGE, &quot;&amp;environment&quot;},
+  {DFSCH_DFSCH_PACKAGE, &quot;&amp;whole&quot;},
+  {DFSCH_DFSCH_PACKAGE, &quot;&amp;aux&quot;},
+  {DFSCH_DFSCH_PACKAGE, &quot;before&quot;},
+  {DFSCH_DFSCH_PACKAGE, &quot;after&quot;},
+  {DFSCH_DFSCH_PACKAGE, &quot;around&quot;},
 };
 
 /*
@@ -1578,7 +1593,7 @@ static void register_static_symbol(symbol_t* s){
   hash_entry_t *e = malloc(sizeof(hash_entry_t));
 
   e-&gt;entry = s;
-  e-&gt;hash = string_hash(s-&gt;data);
+  e-&gt;hash = string_hash(s-&gt;name);
 
   e-&gt;next = global_symbol_hash[e-&gt;hash];
   global_symbol_hash[e-&gt;hash] = e;
@@ -1603,7 +1618,7 @@ static symbol_t* lookup_symbol(char *symbol){
   hash_entry_t *i = global_symbol_hash[hash];
 
   while (i){
-    if (i-&gt;hash == hash &amp;&amp; strcmp(i-&gt;entry-&gt;data, symbol)==0){
+    if (i-&gt;hash == hash &amp;&amp; strcmp(i-&gt;entry-&gt;name, symbol)==0){
       return i-&gt;entry;
     }
     i = i-&gt;next;
@@ -1618,7 +1633,7 @@ static void free_symbol(symbol_t* s){
 
   pthread_mutex_lock(&amp;symbol_lock);
 
-  i = global_symbol_hash[string_hash(s-&gt;data)];
+  i = global_symbol_hash[string_hash(s-&gt;name)];
   j = NULL;
   
   while (i){
@@ -1626,7 +1641,7 @@ static void free_symbol(symbol_t* s){
       if (j){
         j-&gt;next = i-&gt;next;
       } else {
-        global_symbol_hash[string_hash(s-&gt;data)] = i-&gt;next;
+        global_symbol_hash[string_hash(s-&gt;name)] = i-&gt;next;
       }
       free(i);
       break;
@@ -1637,7 +1652,7 @@ static void free_symbol(symbol_t* s){
 
   pthread_mutex_unlock(&amp;symbol_lock);
 
-  s-&gt;data = NULL;
+  s-&gt;name = NULL;
 }
 
 static void symbol_finalizer(symbol_t* symbol, void* cd){
@@ -1649,13 +1664,13 @@ static symbol_t* make_symbol(char *symbol){
   symbol_t *f;
 
   s = GC_NEW(symbol_t); /* !!! free_symbol could be called by this */
-  s-&gt;data = stracpy(symbol);
+  s-&gt;name = stracpy(symbol);
 
   pthread_mutex_lock(&amp;symbol_lock);
 
   f = lookup_symbol(symbol); 
   if (f){ 
-    GC_FREE(s-&gt;data);
+    GC_FREE(s-&gt;name);
     GC_FREE(s);
     pthread_mutex_unlock(&amp;symbol_lock);
     return f;
@@ -1682,7 +1697,8 @@ static symbol_t* make_symbol(char *symbol){
 dfsch_object_t* dfsch_gensym(){
   symbol_t *s = GC_NEW(symbol_t);
 
-  s-&gt;data = NULL;
+  s-&gt;package = DFSCH_DFSCH_USER_PACKAGE;
+  s-&gt;name = NULL;
 
   return DFSCH_TAG_ENCODE(s, 2);
 }
@@ -1711,7 +1727,7 @@ dfsch_object_t* dfsch_make_symbol(char* symbol){
 
 }
 char* dfsch_symbol(dfsch_object_t* symbol){
-  return ((symbol_t*)DFSCH_TAG_REF(DFSCH_ASSERT_TYPE(symbol, SYMBOL)))-&gt;data;
+  return ((symbol_t*)DFSCH_TAG_REF(DFSCH_ASSERT_TYPE(symbol, SYMBOL)))-&gt;name;
 }
 
 char* dfsch_symbol_2_typename(dfsch_object_t* symbol){
@@ -1763,7 +1779,7 @@ char* dfsch_get_next_symbol(dfsch_symbol_iter_t **iter){ // deep magic
     }else{
       hash_entry_t *i = (*iter)-&gt;item;
       (*iter)-&gt;item = (*iter)-&gt;item-&gt;next;
-      return i-&gt;entry-&gt;data;
+      return i-&gt;entry-&gt;name;
     }
   }  
   return NULL;</diff>
      <filename>src/types.c</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>68b4f8dc35bb105d37e31ef2942c5d6b2d9b656b</id>
    </parent>
  </parents>
  <author>
    <name>Ales Hakl</name>
    <email>ales@hakl.net</email>
  </author>
  <url>http://github.com/adh/dfsch/commit/d949ddcdb3ce2816743f828ec41242ff080e96c6</url>
  <id>d949ddcdb3ce2816743f828ec41242ff080e96c6</id>
  <committed-date>2009-11-15T18:24:04-08:00</committed-date>
  <authored-date>2009-11-15T18:24:04-08:00</authored-date>
  <message>preliminary package-related infrastructure</message>
  <tree>a6d1a89076335005e40d327fc83fe29932c4fea6</tree>
  <committer>
    <name>Ales Hakl</name>
    <email>ales@hakl.net</email>
  </committer>
</commit>
