]> git.lizzy.rs Git - metalua.git/blobdiff - src/compiler/mlp_meta.lua
cleanup in mlp, a couple of relevant entries made public
[metalua.git] / src / compiler / mlp_meta.lua
index d3f9187667716e7546bde5ee6895b438e3e55fd2..27d476a157410b7089aa1c6831649e6a82f76600 100644 (file)
 -- for details.
 --
 ----------------------------------------------------------------------
--- History:
--- $Log: mlp_meta.lua,v $
--- Revision 1.4  2006/11/15 09:07:50  fab13n
--- debugged meta operators.
---
--- Revision 1.2  2006/11/09 09:39:57  fab13n
--- some cleanup
---
--- Revision 1.1  2006/11/07 21:29:02  fab13n
--- improved quasi-quoting
---
--- Revision 1.3  2006/11/07 04:38:00  fab13n
--- first bootstrapping version.
---
--- Revision 1.2  2006/11/05 15:08:34  fab13n
--- updated code generation, to be compliant with 5.1
---
-----------------------------------------------------------------------
 
 
 --------------------------------------------------------------------------------
@@ -39,9 +21,6 @@
 --
 --------------------------------------------------------------------------------
 
---require "compile"
---require "ldump"
-
 module ("mlp", package.seeall)
 
 --------------------------------------------------------------------------------
@@ -51,11 +30,8 @@ module ("mlp", package.seeall)
 --------------------------------------------------------------------------------
 
 function splice (ast)
-   --printf(" [SPLICE] Ready to compile:\n%s", _G.table.tostring (ast, "nohash", 60))
-   local f = mlc.function_of_ast(ast)
-   --printf " [SPLICE] Splice Compiled."
-   local result = f()   
-   --printf " [SPLICE] Splice Evaled."
+   local f = mlc.function_of_ast(ast, '=splice')
+   local result=f()
    return result
 end
 
@@ -68,9 +44,11 @@ function quote (t)
    local cases = { }
    function cases.table (t)
       local mt = { tag = "Table" }
+      --_G.table.insert (mt, { tag = "Pair", quote "quote", { tag = "True" } })
       if t.tag == "Splice" then
          assert (#t==1, "Invalid splice")
-         return t[1]
+         local sp = t[1]
+         return sp
       elseif t.tag then
          _G.table.insert (mt, { tag = "Pair", quote "tag", quote (t.tag) })
       end
@@ -79,8 +57,8 @@ function quote (t)
       end
       return mt
    end
-   function cases.number (t) return { tag = "Number", t } end
-   function cases.string (t) return { tag = "String", t } end
+   function cases.number (t) return { tag = "Number", t, quote = true } end
+   function cases.string (t) return { tag = "String", t, quote = true } end
    return cases [ type (t) ] (t)
 end
 
@@ -102,12 +80,6 @@ function splice_content (lx)
       lx:next() -- skip ":"
       assert (a.tag=="Id", "Invalid splice parser name")
       parser_name = a[1]
---       printf("this splice is a %s", parser_name)
---    else
---       printf("no splice specifier:\npeek(1)")
---       _G.table.print(lx:peek(1))
---       printf("peek(2)")
---       _G.table.print(lx:peek(2))
    end
    local ast = mlp[parser_name](lx)
    if in_a_quote then
@@ -127,20 +99,19 @@ end
 -- Parse the inside of a "+{ ... }"
 --------------------------------------------------------------------------------
 function quote_content (lx)
-   local parser = mlp.expr
-   if lx:is_keyword (lx:peek(2), ":") then
+   local parser 
+   if lx:is_keyword (lx:peek(2), ":") then -- +{parser: content }
       parser = mlp[id(lx)[1]]
       lx:next()
+   else -- +{ content }
+      parser = mlp.expr
    end
-   --assert(not in_a_quote, "Nested quotes not handled yet")
+
    local prev_iq = in_a_quote
    in_a_quote = true
    --print("IN_A_QUOTE")
    local content = parser (lx)
    local q_content = quote (content)
-   --printf("/IN_A_QUOTE:\n* content=\n%s\n* q_content=\n%s\n",
-   --       _G.table.tostring(content, "nohash", 60),
-   --       _G.table.tostring(q_content, "nohash", 60))
    in_a_quote = prev_iq
    return q_content
 end