<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -11,7 +11,7 @@ module Wy.Foundation
   ) where
 
 foundationText = unlines [
-  &quot;#{f.split(&quot;\n&quot;).map { |l| l.gsub('&quot;', '\&quot;') }.join(&quot;\&quot;,\n  \&quot;&quot;)}&quot;]
+  &quot;#{f.split(&quot;\n&quot;).map { |l| l.gsub(&quot;\\&quot;, &quot;\\\\\\&quot;).gsub('&quot;', '\&quot;') }.join(&quot;\&quot;,\n  \&quot;&quot;)}&quot;]
   EOS
 
   File.open('build/foundation.hs', 'w') { |f| f &lt;&lt; cnt }</diff>
      <filename>haskell/inline.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,113 @@
+def(module, name, body,
+  primitive('module')
+)
+
+def(import, name,
+  primitive('import')
+)
+
 module(Foundation, 
+  def(macrop, exp, priority, body,
+    primitive('macrop')
+  )
+
+  def(lambda, parameters\, body,
+    primitive('lambda')
+  )
 
-  // A few macros defining macros to get started
+  def(`, expr,
+    primitive('`')
+  )
+  
   macrop(macro(`exp, `body), 10, `(macrop($exp, 10, $body)));
   macro(macrox(`exp, `body), `(macrop($exp, 10, `($body))));
   macro(macropx(`exp, `priority, `body), `(macrop($exp, $priority, `($body))));
 
+  // Expressions inspection
+  //
+
+  def(applic?, expression,
+    primitive('applic?')
+  )
+
+  def(fnName, expression,
+    primitive('fnName')
+  )
+
+  def(params, expression,
+    primitive('params')
+  )
+
+  def(nthParam, expression, idx,
+    primitive('nthParam')
+  )
+
+  def(defined?, expression,
+    primitive('defined?')
+  )
+
+  def(empty?, expression,
+    primitive('applic?')
+  )
+
+  // Comparison and arithmetic operators
+  //
+  def(==, lexpr, rexpr,
+    primitive('==')
+  )
+
+  def(!=, lexpr, rexpr,
+    primitive('!=')
+  )
+
+  def(&lt;, lexpr, rexpr,
+    primitive('&lt;')
+  )
+
+  def(&gt;, lexpr, rexpr,
+    primitive('&gt;')
+  )
+
+  def(&lt;=, lexpr, rexpr,
+    primitive('&lt;=')
+  )
+
+  def(&gt;=, lexpr, rexpr,
+    primitive('&gt;=')
+  )
+
+  def(!, lexpr, rexpr,
+    primitive('!')
+  )
+
+  def(&amp;&amp;, lexpr, rexpr,
+    primitive('&amp;&amp;')
+  )
+
+  def(||, lexpr, rexpr,
+    primitive('||')
+  )
+
+  def(=, name, value,
+    primitive('=')
+  )
+
+  def(+, lexpr, rexpr,
+    primitive('+')
+  )
+
+  def(-, lexpr, rexpr,
+    primitive('-')
+  )
+
+  def(*, lexpr, rexpr,
+    primitive('*')
+  )
+
+  def(/, lexpr, rexpr,
+    primitive('/')
+  )
+
   // Arithmetic operators
   macrop(`a = `b, 1,
     if(applic?(a),
@@ -15,11 +118,10 @@ module(Foundation,
   )
   macropx(`a += `b, 1, $a = $a + $b);
   macropx(`a -= `b, 1, $a = $a - $b);
-  macropx(`a &lt;&lt; `b, 1, &lt;&lt;($a, $b));
-  macropx(`a &gt;&gt; `b, 1, &gt;&gt;($a, $b));
   macropx(`a || `b, 2, ||($a, $b));
   macropx(`a &amp;&amp; `b, 3, &amp;&amp;($a, $b));
   macropx(`a == `b, 4, ==($a, $b));
+  macropx(`a != `b, 4, !=($a, $b));
   macropx(`a &lt;= `b, 5, &lt;=($a, $b));
   macropx(`a &gt;= `b, 5, &gt;=($a, $b));
   macropx(`a &lt; `b, 5, &lt;($a, $b));
@@ -41,6 +143,10 @@ module(Foundation,
     )
   )
 
+  def(::, elmt, list,
+    primitive('::')
+  )
+
   // Access to module definitions from outside
   macro(`mod :: `def, 
     if(applic?(def),
@@ -52,25 +158,102 @@ module(Foundation,
     )
   )
 
-  macrox(unless(`cond, `body), if(!($cond), $body)) 
+  // Control structures
+  //
 
-  foldl1 = lambda(fn, arr, foldl(fn, head(arr), tail(arr)))
+  def(if, cond, body, contra,
+    primitive('if')
+  )
+
+  macrox(unless(`cond, `body, `contra?), if(!($cond), $body, $contra)) 
+
+  def(foldr, fn, init, list,
+    primitive('foldr')
+  )
+  
   foldr1 = lambda(fn, arr, foldr(fn, head(arr), tail(arr)))
 
+  def(foldl, fn, init, list,
+    primitive('foldl')
+  )
+
+  foldl1 = lambda(fn, arr, foldl(fn, head(arr), tail(arr)))
+
   map = lambda(fn, arr, foldr(lambda(x, ys, [fn(x)] + ys), [], arr))
 
   for = lambda(arr, l, 
     foldl(lambda(acc, x, l(x)), null, arr)
   )
 
+  def(callcc, fn,
+    primitive('callcc')
+  )
+
+  // Error handling
+  //
+
   UnknownRef = { type: 'UnknownRef' }
   ArgumentError = { type: 'ArgumentError' }
   SysError = [UnknownRef, ArgumentError]
 
+  def(try, body, catches\,
+    primitive('try')
+  )
+
+  def(raise, err,
+    primitive('raise')
+  )
+
   macrox(catch(`err, `var?, `body?), [$err, lambda($var, $body)])
+
+  // Data structures
+
+  def(L, elmts\,
+    primitive('L')
+  )
+
+  def(@, list, elmt,
+    primitive('@')
+  )
+
+  def(&lt;&lt;, list, elmt,
+    primitive('&lt;&lt;')
+  )
+  macropx(`a &lt;&lt; `b, 1, &lt;&lt;($a, $b));
+
+  def(&gt;&gt;, elmt, list,
+    primitive('&gt;&gt;')
+  )
+  macropx(`a &gt;&gt; `b, 1, &gt;&gt;($a, $b));
+
+  def(@!, ref, val,
+    primitive('@!')
+  )
+
+  def(push!, list, val,
+    primitive('push!')
+  )
+
+  def(length, l,
+    primitive('length')
+  )
+
   head = lambda(a, a.0)
+
   tail = lambda(a, slice(a, 1))
 
+  def(toS, elmt,
+    primitive('toS')
+  )
+
+  def(slice, list, start, end,
+    primitive('slice')
+  )
+
+  def(reverse, l,
+    primitive('reverse')
+  )
+
   join = lambda(arr, sep?, 
     foldl1(
       lambda(a, b, 
@@ -92,6 +275,20 @@ module(Foundation,
       )
     )
   )
+
+  // IO
+
+  def(print, elmts\,
+    primitive('print')
+  )
+
+  def(load, f,
+    primitive('load')
+  )
+
+  def(arguments,
+    primitive(arguments)
+  )
 )
 
 import(Foundation)</diff>
      <filename>haskell/src/foundation.wy</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,5 @@
 module Wy.Prim
-  ( primitives
+  ( defWy
   ) where
 
 import Control.Monad(liftM, liftM2, foldM)
@@ -19,6 +19,20 @@ import Wy.Parser(ASTType(..), parseWy)
 import Wy.Interpr
 import Wy.Types
 
+-- Main definition function, used to import all primitives in the running
+-- environment.
+
+defWy ps = do
+  env &lt;- ask
+  case last ps of
+    (ASTStmt [ASTApplic (ASTId n) [ASTString primName]]) | n == &quot;primitive&quot; -&gt; do
+      defName &lt;- extractId $ head ps
+      case M.lookup primName $ primitives M.empty of
+        Nothing -&gt; throwError $ ArgumentErr (&quot;Unknown primitive referenced in def: &quot; ++ primName)
+        Just x  -&gt; liftIO $ varUpdate env defName x
+    x -&gt; do params &lt;- mapM extractId $ init ps
+            return $ WyLambda params (last ps) env
+
 primitives f = arithmPrim $ basePrim $ dataPrim $ packagePrim $ metaPrim $ stdIOPrim f
 
 basePrim f =
@@ -131,6 +145,7 @@ arithmPrim f =
   defp &quot;/&quot; (opEvalM wyDiv) $
   defp &quot;!&quot; (\ps -&gt; liftM (WyBool . not . truthy) (eval $ ps !! 0)) $
   defp &quot;==&quot; (opEval $ boolComp (==)) $
+  defp &quot;!=&quot; (opEval $ boolComp (/=)) $
   defp &quot;&lt;=&quot; (opEval $ boolComp (&lt;=)) $
   defp &quot;&gt;=&quot; (opEval $ boolComp (&gt;=)) $
   defp &quot;&lt;&quot; (opEval $ boolComp (&lt;)) $
@@ -333,10 +348,6 @@ stdIOPrim f =
 
 defp n l = M.insert n (WyPrimitive n l)
 
-extractId (ASTId i) = return i
-extractId (ASTStmt [ASTId i]) = return i
-extractId x = throwError $ ArgumentErr $ &quot;Non identifier value when one was expected: &quot; ++ (show x)
-
 extractName (ASTId i) = return i
 extractName (ASTStmt [ASTId i]) = return i
 extractName (ASTString s) = return s</diff>
      <filename>haskell/src/prim.hs</filename>
    </modified>
    <modified>
      <diff>@@ -36,10 +36,12 @@ mhead []      = Nothing
 mhead (x:xs)  = Just x
 
 main = do params &lt;- getArgs
-          p &lt;- newIORef $ primitives M.empty
-          m &lt;- newIORef  M.empty
+          p &lt;- newIORef $ M.insert &quot;def&quot; (WyPrimitive &quot;def&quot; defWy) M.empty
+          m &lt;- newIORef M.empty
           let blankEnv = S.empty |&gt; Frame p m False
-          env &lt;- liftM snd $ wyInterpr blankEnv &quot;foundation&quot; foundationText
+          e &lt;-  wyInterpr blankEnv &quot;foundation&quot; foundationText
+          either (putStrLn . show) (showWy &gt;=&gt; putStrLn) $ fst e
+          let env = snd e
           case mhead params of
             Just x -&gt; do cnt &lt;- readFile x
                          e &lt;- wyInterpr env x cnt</diff>
      <filename>haskell/src/repl.hs</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,8 @@
 module Wy.Types
   ( ASTType(..),
     WyError(..),
-    WyType(..), readRef, mapReadRef, newWyRef, truthy, wyToAST, showWy, macroPivot, 
+    WyType(..), readRef, mapReadRef, newWyRef, truthy, wyToAST, showWy, macroPivot,
+    extractId,
     wyPlus, wyMinus, wyDiv, wyMult,
     WyEnv, Frame(..), macroValue, varValue, macroUpdate, varUpdate, envStack, envAdd, envAddMod,
     Eval, localM, localIO, runEval, appErr1, appErr2
@@ -154,6 +155,10 @@ instance Ord (IORef WyType) where
 wyToAST (WyTemplate t) = t
 wyToAST x = ASTWyWrapper x
 
+extractId (ASTId i) = return i
+extractId (ASTStmt [ASTId i]) = return i
+extractId x = throwError $ ArgumentErr $ &quot;Non identifier value when one was expected: &quot; ++ (show x)
+
 -- Environment definition
 --
 </diff>
      <filename>haskell/src/types.hs</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>52046ef92e7e93976db38a1e22de796402c9e9d2</id>
    </parent>
  </parents>
  <author>
    <name>Matthieu Riou</name>
    <email>mriou@apache.org</email>
  </author>
  <url>http://github.com/matthieu/witty/commit/b65e6ee6f95c470ba416d65ec2c2077ef512a501</url>
  <id>b65e6ee6f95c470ba416d65ec2c2077ef512a501</id>
  <committed-date>2009-02-27T22:26:06-08:00</committed-date>
  <authored-date>2009-02-27T22:26:06-08:00</authored-date>
  <message>The whole witty library in a single file, less than 300 lines.</message>
  <tree>eb21dd11ef91abb9e7583b39e2c45d7bcb1b833d</tree>
  <committer>
    <name>Matthieu Riou</name>
    <email>mriou@apache.org</email>
  </committer>
</commit>
