hygienic macros, take two: H{ }+{ } and -{! }
[metalua.git] / src / samples / h_test.mlua
blob368c9d6fd688f3ccf3bcd3e676214130f082744c
1 -{ extension 'log' }
2 -{ extension  'H'  }
4 require 'metalua.compiler'
6 --assert (+{foo}.quote, "no q!?")
8 -- Usage samples:
10 TEST_CASES = { 
12    {  "everything should be renamed",
13       +{ block: 
14          local x = 3
15          print(x) },
16       { } }, 
18   {  "don't get confused between global and local x",
19      +{ block: 
20         print(x)
21         local x = 3
22         print(x) },
23      { alpha = { } } },
25   {  "don't rename keepme",
26      +{ block:
27         keepme()
28         dont_keep_me() },
29      { keep = 'keepme' , alpha = `Local{ { }, { } } } },
31   {  "print shouldn't be renamed the 2nd and 3rd time",
32      +{ block:
33         print(i)
34         -{!`Call{`Id 'print', `String 'hi' } } 
35         -- Bugger. I don't detect any non-quoted element , so 
36         -- the -{+{ }} thingie won't protect from capture.
37         -{!+{print 'hi'}} },
38      { } },
40   {  "print shouldn't be renamed at all",
41      +{ block: 
42         print(i)
43         -{`Call{`Id 'print', `String 'hi' } }
44         -{+{print 'hi'}} },
45      { keep = 'print' } },
47   {  "Rename print with a pre-specified name, rename x freely, not y",
48      +{ block: 
49         print (x, y) },
50      {  alpha = +{stat: local RENAMED_PRINT = print}, 
51         keep  = {y = true} } } }
53 --   { +{ block: -- 
54 --         },
55 --     { } },
57 for case in values(TEST_CASES) do
58    local comment, ast, cfg = unpack(case)
59    print ('\n'..'-':rep(70))
60    print (comment)
61    print ("BEFORE PARSING:")
62    $log (ast, 50, 'nohash')
63    local _, alpha = H(cfg)(ast)
64    print ("AFTER PARSING:")
65    $log (ast, alpha, cfg.alpha, 50, 'nohash')
66 end
68 print ('\n'..'=':rep(70))
69 $log(TEST_CASES,40)