$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r61462 - trunk/libs/spirit/example/scheme/scheme
From: joel_at_[hidden]
Date: 2010-04-21 10:21:09
Author: djowel
Date: 2010-04-21 10:21:08 EDT (Wed, 21 Apr 2010)
New Revision: 61462
URL: http://svn.boost.org/trac/boost/changeset/61462
Log:
More error handling tweaks
Text files modified: 
   trunk/libs/spirit/example/scheme/scheme/compiler.hpp |    28 +++++++++++++++++++++++-----            
   1 files changed, 23 insertions(+), 5 deletions(-)
Modified: trunk/libs/spirit/example/scheme/scheme/compiler.hpp
==============================================================================
--- trunk/libs/spirit/example/scheme/scheme/compiler.hpp	(original)
+++ trunk/libs/spirit/example/scheme/scheme/compiler.hpp	2010-04-21 10:21:08 EDT (Wed, 21 Apr 2010)
@@ -57,11 +57,11 @@
     {
         std::string msg;
         duplicate_identifier(std::string const& id)
-          : msg("scheme: Duplicate identifier (" + id + ')') {}
+          : msg("scheme: Duplicate identifier (" + id + ").") {}
 
         virtual const char* what() const throw()
         {
-            return "scheme: Duplicate identifier.";
+            return msg.c_str();
         }
     };
 
@@ -83,7 +83,22 @@
 
         virtual const char* what() const throw()
         {
-            return msg.c_str();;
+            return msg.c_str();
+        }
+    };
+
+    struct function_application_expected : scheme_exception
+    {
+        std::string msg;
+        function_application_expected(utree const& got)
+        {
+            // $$$ TODO: add got to message $$$
+            msg = "scheme: Function application expected";
+        }
+
+        virtual const char* what() const throw()
+        {
+            return msg.c_str();
         }
     };
 
@@ -245,6 +260,9 @@
         template <typename Iterator>
         function operator()(boost::iterator_range<Iterator> const& range) const
         {
+            if (range.begin()->which() != utree_type::symbol_type)
+                throw function_application_expected(*range.begin());
+
             std::string name(get_symbol(*range.begin()));
 
             if (name == "quote")
@@ -329,8 +347,8 @@
                 throw identifier_not_found(name);
             }
 
-            // Just return the list $$$ TODO $$$ how do we disambiguate lists
-            // and function calls?
+            // Can't reach here
+            throw compilation_error();
             return function();
         }