<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,43 +1,84 @@
-from macro import ExprMacro, StmtMacro, Var
+from macro import Macro, ExprMacro, StmtMacro, Var
 
 class Assign(ExprMacro):
-	stage = 500
+	stage = 200
 	syntax = Var, ('op', '='), Var
 	
 	def transform(self, left, right):
 		return ('=', left, right)
 
 class Equals(ExprMacro):
-	stage = 200
+	stage = 150
 	syntax = Var, ('op', '=='), Var
 	
 	def transform(self, left, right):
 		return ('==', left, right)
 
 class Add(ExprMacro):
-	stage = 200
+	stage = 103
 	syntax = Var, ('op', '+'), Var
 	
 	def transform(self, left, right):
 		return ('+', left, right)
 
 class Def(StmtMacro):
-	stage = 500
+	stage = 300
 	syntax = ('name', 'def'), Var, Var, Var
 	
 	def transform(self, name, args, block):
 		return ('def', name, args, block)
 
 class When(StmtMacro):
-	stage = 500
+	stage = 300
 	syntax = ('name', 'when'), Var, Var
 	
 	def transform(self, cond, block):
 		return ('when', cond, block)
 
 class Yield(StmtMacro):
-	stage = 500
+	stage = 300
 	syntax = ('name', 'yield'), Var
 	
 	def transform(self, value):
 		return ('yield', value)
+
+class Return(StmtMacro):
+	stage = 300
+	syntax = ('name', 'return'), Var
+	
+	def transform(self, value):
+		return ('return', value)
+
+class Print(StmtMacro):
+	stage = 300
+	syntax = ('name', 'print'), Var
+	
+	def transform(self, value):
+		return ('print', value)
+
+class Call(Macro):
+	stage = 300
+	
+	def matches(self, node):
+		for i in xrange(1, len(node)-1):
+			try:
+				if node[i][0] == 'name' and node[i+1][0] == 'group':
+					self.pos = i
+					return True
+			except:
+				pass
+		return False
+	
+	def transform(self, node):
+		return node[:self.pos] + tuple(((node[self.pos][1], ) + node[self.pos+1][1:], )) + node[self.pos+2:]
+
+class Cull(Macro):
+	stage = 1000
+	
+	def matches(self, node):
+		if node[0] in ('expr', 'group', 'stmt') and len(node) == 2:
+			return True
+		return False
+	
+	def transform(Self, node):
+		return node[1]</diff>
      <filename>coremacros.py</filename>
    </modified>
    <modified>
      <diff>@@ -73,7 +73,10 @@ class Parser(object):
 				self.semi = False
 			elif self.semi == False:
 				self.semi = None
-		return self.toTuple(self.stack[0])
+		
+		while len(self.stack):
+			self.pop(None)
+		return self.toTuple(self.cur)
 	
 	def toTuple(self, data):
 		if isinstance(data, list):
@@ -88,7 +91,8 @@ class Parser(object):
 		self.cur = new
 	
 	def pop(self, type):
-		if self.cur[0] == type:
+		if type == None or self.cur[0] == type:
+			type = self.cur[0]
 			self.cur = self.stack.pop()
 			if type in ('expr', 'stmt') and len(self.cur[-1]) == 1:
 				del self.cur[-1]</diff>
      <filename>parse.py</filename>
    </modified>
    <modified>
      <diff>@@ -1,11 +1,13 @@
 # Types are inferred to be: fib : int * int -&gt; yields int
 def fib(a = 0, b = 0) {
 	when(b == 0) {
-		yield 1
+		print 1
+		#yield 1
 		return fib(0, 1)
 	}
-	yield a+b
+	print a+b
+	#yield a+b
 	fib(b, a+b) # Implicit return
 }
 
-print fib()
+fib()</diff>
      <filename>test.ul</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>17ee125485c946e58f579ae32c197b5dc48e33fa</id>
    </parent>
  </parents>
  <author>
    <name>Cody Brocious</name>
    <email>cody.brocious@gmail.com</email>
  </author>
  <url>http://github.com/daeken/Ultilang/commit/458b1db5ceb8d87a6f0cd93d13a72bc034a56198</url>
  <id>458b1db5ceb8d87a6f0cd93d13a72bc034a56198</id>
  <committed-date>2009-06-29T09:07:54-07:00</committed-date>
  <authored-date>2009-06-29T09:07:54-07:00</authored-date>
  <message>Added return, print, call, and culling macros.
Rearranged precedence table.
Culled empty stmt nodes from the parse tree.
Modified test.ul to be more easily compilable in the short term.</message>
  <tree>0b10de774ca69806c849c9554a9d60314d807c51</tree>
  <committer>
    <name>Cody Brocious</name>
    <email>cody.brocious@gmail.com</email>
  </committer>
</commit>
