+defVar(name::AbstractString, var::Symbol) = defPrim(name, quote
+ pushPS($var)
+ jmp = NEXT
+end)
+
+defConst(name::AbstractString, val::Int64) = defPrim(name, quote
+ pushPS($val)
+ jmp = Next
+end)
+
+callPrim(addr::Int64) = eval(primitives[-addr])
+
+# Threading Primitives
+
+NEXT = defPrim("NEXT", quote
+ W = memory[IP]
+ IP += 1
+ X = memory[W]
+ jmp = X
+end)
+
+DOCOL = defPrim("DOCOL", quote
+ pushRS(IP)
+ IP = W + 1
+ jmp = NEXT
+end)
+
+EXIT = defPrim("EXIT", quote
+ IP = popRS()
+ jmp = NEXT
+end)
+
+
+# Basic forth primitives
+
+DROP = defPrim("DROP", quote
+ popPS()
+ jmp = NEXT
+end)
+
+SWAP = defPrim("SWAP", quote
+ PS[PSP], PS[PSP-1] = PS[PSP-1], PS[PS]
+ jmp = NEXT
+end)
+
+DUP = defPrim("DUP", quote
+ pushPS(PS[PSP])
+ jmp = NEXT
+end)
+
+LIT = defPrim("LIT", quote
+ pushPS(memory[IP])
+ IP += 1
+ jmp = NEXT
+end)
+
+# Memory primitives
+
+STORE = defPrim("!", quote
+ addr = popPS()
+ dat = popPS()
+ memory[addr] = dat
+ jmp = NEXT
+end)
+
+FETCH = defPrim("@", quote
+ addr = popPS()
+ pushPS(memory[addr])
+ jmp = NEXT
+end)
+
+ADDSTORE = defPrim("+!", quote
+ addr = popPS()
+ toAdd = popPS()
+ memory[addr] += toAdd
+ jmp = NEXT
+end)