diff options
| author | Li Jin <dragon-fly@qq.com> | 2021-11-19 13:23:11 +0800 |
|---|---|---|
| committer | Li Jin <dragon-fly@qq.com> | 2021-11-19 13:23:11 +0800 |
| commit | 2ff18b4fb66d25d22e5a25fb386fe171853e0b06 (patch) | |
| tree | d6e6f1671f74a4430b24869c74767aaf0ee2e128 /spec | |
| parent | a8e5aaf64969792741f3a094fe0070ddb5e3bc7d (diff) | |
| download | yuescript-2ff18b4fb66d25d22e5a25fb386fe171853e0b06.tar.gz yuescript-2ff18b4fb66d25d22e5a25fb386fe171853e0b06.tar.bz2 yuescript-2ff18b4fb66d25d22e5a25fb386fe171853e0b06.zip | |
try to fix issue #69 with new macro functions. add builtin macro $MODULE and $LINE.
Diffstat (limited to 'spec')
| -rw-r--r-- | spec/inputs/macro-teal.yue | 20 | ||||
| -rw-r--r-- | spec/inputs/macro.yue | 38 | ||||
| -rw-r--r-- | spec/outputs/macro.lua | 31 |
3 files changed, 70 insertions, 19 deletions
diff --git a/spec/inputs/macro-teal.yue b/spec/inputs/macro-teal.yue index 3a9bb2b..951e882 100644 --- a/spec/inputs/macro-teal.yue +++ b/spec/inputs/macro-teal.yue | |||
| @@ -4,8 +4,8 @@ $ -> | |||
| 4 | options.target_extension = "tl" | 4 | options.target_extension = "tl" |
| 5 | package.path ..= "?.lua;./spec/lib/?.lua" | 5 | package.path ..= "?.lua;./spec/lib/?.lua" |
| 6 | 6 | ||
| 7 | macro to_lua = (codes)-> | 7 | macro to_lua = (code)-> |
| 8 | "require('yue').to_lua(#{codes}, reserve_line_number:false, same_module:true)" | 8 | "require('yue').to_lua(#{code}, reserve_line_number:false, same_module:true)" |
| 9 | 9 | ||
| 10 | macro trim = (name)-> | 10 | macro trim = (name)-> |
| 11 | "if result = #{name}\\match '[\\'\"](.*)[\\'\"]' then result else #{name}" | 11 | "if result = #{name}\\match '[\\'\"](.*)[\\'\"]' then result else #{name}" |
| @@ -16,12 +16,12 @@ export macro local = (decl, value = nil)-> | |||
| 16 | if not (name and type) | 16 | if not (name and type) |
| 17 | error "invalid local varaible declaration for \"#{decl}\"" | 17 | error "invalid local varaible declaration for \"#{decl}\"" |
| 18 | value = $to_lua(value)\gsub "^return ", "" | 18 | value = $to_lua(value)\gsub "^return ", "" |
| 19 | codes = if tl_enabled | 19 | code = if tl_enabled |
| 20 | "local #{name}:#{$trim type} = #{value}" | 20 | "local #{name}:#{$trim type} = #{value}" |
| 21 | else | 21 | else |
| 22 | "local #{name} = #{value}" | 22 | "local #{name} = #{value}" |
| 23 | { | 23 | { |
| 24 | :codes | 24 | :code |
| 25 | type: "text" | 25 | type: "text" |
| 26 | locals: {name} | 26 | locals: {name} |
| 27 | } | 27 | } |
| @@ -37,28 +37,28 @@ export macro function = (decl, value)-> | |||
| 37 | _, node = tl.parse_program tokens,{},"macro-function" | 37 | _, node = tl.parse_program tokens,{},"macro-function" |
| 38 | args = table.concat [arg.tk for arg in *node[1].args],", " | 38 | args = table.concat [arg.tk for arg in *node[1].args],", " |
| 39 | value = "(#{args})#{value}" | 39 | value = "(#{args})#{value}" |
| 40 | codes = if tl_enabled | 40 | code = if tl_enabled |
| 41 | value = $to_lua(value)\match "function%([^\n]*%)(.*)end" | 41 | value = $to_lua(value)\match "function%([^\n]*%)(.*)end" |
| 42 | "local function #{name}#{type}\n#{value}\nend" | 42 | "local function #{name}#{type}\n#{value}\nend" |
| 43 | else | 43 | else |
| 44 | value = $to_lua(value)\gsub "^return ", "" | 44 | value = $to_lua(value)\gsub "^return ", "" |
| 45 | "local #{name} = #{value}" | 45 | "local #{name} = #{value}" |
| 46 | { | 46 | { |
| 47 | :codes | 47 | :code |
| 48 | type: "text" | 48 | type: "text" |
| 49 | locals: {name} | 49 | locals: {name} |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | export macro record = (name, decl)-> | 52 | export macro record = (name, decl)-> |
| 53 | import "yue" as {options:{:tl_enabled}} | 53 | import "yue" as {options:{:tl_enabled}} |
| 54 | codes = if tl_enabled | 54 | code = if tl_enabled |
| 55 | "local record #{name} | 55 | "local record #{name} |
| 56 | #{decl} | 56 | #{decl} |
| 57 | end" | 57 | end" |
| 58 | else | 58 | else |
| 59 | "local #{name} = {}" | 59 | "local #{name} = {}" |
| 60 | { | 60 | { |
| 61 | :codes | 61 | :code |
| 62 | type: "text" | 62 | type: "text" |
| 63 | locals: {name} | 63 | locals: {name} |
| 64 | } | 64 | } |
| @@ -74,14 +74,14 @@ export macro method = (decl, value)-> | |||
| 74 | _, node = tl.parse_program tokens,{},"macro-function" | 74 | _, node = tl.parse_program tokens,{},"macro-function" |
| 75 | args = table.concat [arg.tk for arg in *node[1].args],", " | 75 | args = table.concat [arg.tk for arg in *node[1].args],", " |
| 76 | value = "(#{args})->#{value\match "[%-=]>(.*)"}" | 76 | value = "(#{args})->#{value\match "[%-=]>(.*)"}" |
| 77 | codes = if tl_enabled | 77 | code = if tl_enabled |
| 78 | value = $to_lua(value)\match "^return function%(.-%)\n(.*)end" | 78 | value = $to_lua(value)\match "^return function%(.-%)\n(.*)end" |
| 79 | "function #{tab}#{sym}#{func}#{type}\n#{value}\nend" | 79 | "function #{tab}#{sym}#{func}#{type}\n#{value}\nend" |
| 80 | else | 80 | else |
| 81 | value = $to_lua(value)\gsub "^return ", "" | 81 | value = $to_lua(value)\gsub "^return ", "" |
| 82 | "#{tab}.#{func} = #{value}" | 82 | "#{tab}.#{func} = #{value}" |
| 83 | { | 83 | { |
| 84 | :codes | 84 | :code |
| 85 | type: "text" | 85 | type: "text" |
| 86 | } | 86 | } |
| 87 | 87 | ||
diff --git a/spec/inputs/macro.yue b/spec/inputs/macro.yue index 2dd15ac..366a3d9 100644 --- a/spec/inputs/macro.yue +++ b/spec/inputs/macro.yue | |||
| @@ -69,9 +69,9 @@ $foreach $filter($map({1,2,3}, _ * 2), _ > 4), print _ | |||
| 69 | 69 | ||
| 70 | val = $pipe( | 70 | val = $pipe( |
| 71 | {1, 2, 3} | 71 | {1, 2, 3} |
| 72 | $map(_ * 2) | 72 | [[$map(_ * 2)]] |
| 73 | $filter(_ > 4) | 73 | [[$filter(_ > 4)]] |
| 74 | $reduce(0, _1 + _2) | 74 | [[$reduce(0, _1 + _2)]] |
| 75 | ) | 75 | ) |
| 76 | 76 | ||
| 77 | macro plus = (a, b)-> "#{a} + #{b}" | 77 | macro plus = (a, b)-> "#{a} + #{b}" |
| @@ -110,8 +110,8 @@ do | |||
| 110 | a += $get_inner_hygienic! | 110 | a += $get_inner_hygienic! |
| 111 | print a | 111 | print a |
| 112 | 112 | ||
| 113 | macro lua = (codes)-> { | 113 | macro lua = (code)-> { |
| 114 | :codes | 114 | :code |
| 115 | type: "lua" | 115 | type: "lua" |
| 116 | } | 116 | } |
| 117 | 117 | ||
| @@ -136,7 +136,7 @@ macro def = (fname, ...)-> | |||
| 136 | args = {...} | 136 | args = {...} |
| 137 | last = table.remove args | 137 | last = table.remove args |
| 138 | { | 138 | { |
| 139 | codes: $showMacro "def", "local function #{fname}(#{table.concat args, ', '}) | 139 | code: $showMacro "def", "local function #{fname}(#{table.concat args, ', '}) |
| 140 | #{last} | 140 | #{last} |
| 141 | end" | 141 | end" |
| 142 | type: "lua" | 142 | type: "lua" |
| @@ -155,7 +155,7 @@ $def sel, a, b, c, [[ | |||
| 155 | $def dummy,[[]] | 155 | $def dummy,[[]] |
| 156 | 156 | ||
| 157 | macro insertComment = (text)-> { | 157 | macro insertComment = (text)-> { |
| 158 | codes: "-- #{text\match '[\'"](.*)[\'"]'}" | 158 | code: "-- #{text\match '[\'"](.*)[\'"]'}" |
| 159 | type: "lua" | 159 | type: "lua" |
| 160 | } | 160 | } |
| 161 | 161 | ||
| @@ -239,7 +239,7 @@ macro chainC = (...)-> | |||
| 239 | else | 239 | else |
| 240 | callable = itemCodes | 240 | callable = itemCodes |
| 241 | { | 241 | { |
| 242 | codes: $showMacro "chainC", callable | 242 | code: $showMacro "chainC", callable |
| 243 | type: "lua" | 243 | type: "lua" |
| 244 | } | 244 | } |
| 245 | 245 | ||
| @@ -253,7 +253,27 @@ $chainC( | |||
| 253 | Destroy! | 253 | Destroy! |
| 254 | ) | 254 | ) |
| 255 | 255 | ||
| 256 | macro tb = -> "{'abc', a:123, call#:=> 998}" | ||
| 257 | print $tb[1], $tb.a, ($tb)!, $tb! | ||
| 258 | |||
| 259 | print "current line: #{ $LINE }" | ||
| 260 | |||
| 261 | macro todoInner = (module, line, msg)-> | ||
| 262 | print "TODO#{msg and ': ' .. msg or ''} in file #{module}, at line #{line}" | ||
| 263 | { | ||
| 264 | code: "-- TODO#{msg and ': ' .. msg or ''}" | ||
| 265 | type: "lua" | ||
| 266 | } | ||
| 267 | |||
| 268 | macro todo = (msg)-> | ||
| 269 | if msg | ||
| 270 | "$todoInner $MODULE, $LINE, #{msg}" | ||
| 271 | else | ||
| 272 | "$todoInner $MODULE, $LINE" | ||
| 273 | |||
| 274 | $todo | ||
| 275 | |||
| 256 | macro implicitReturnMacroIsAllowed = -> "print 'abc'\n123" | 276 | macro implicitReturnMacroIsAllowed = -> "print 'abc'\n123" |
| 257 | 277 | ||
| 258 | $implicitReturnMacroIsAllowed! | 278 | $implicitReturnMacroIsAllowed |
| 259 | 279 | ||
diff --git a/spec/outputs/macro.lua b/spec/outputs/macro.lua index a2430a2..7812182 100644 --- a/spec/outputs/macro.lua +++ b/spec/outputs/macro.lua | |||
| @@ -229,5 +229,36 @@ end | |||
| 229 | origin.transform.root.gameObject:Parents():Descendants():SelectEnable():SelectVisible():TagEqual("fx"):Where(function(x) | 229 | origin.transform.root.gameObject:Parents():Descendants():SelectEnable():SelectVisible():TagEqual("fx"):Where(function(x) |
| 230 | return x.name:EndsWith("(Clone)") | 230 | return x.name:EndsWith("(Clone)") |
| 231 | end):Destroy() | 231 | end):Destroy() |
| 232 | print((setmetatable({ | ||
| 233 | 'abc', | ||
| 234 | a = 123, | ||
| 235 | }, { | ||
| 236 | __call = function(self) | ||
| 237 | return 998 | ||
| 238 | end | ||
| 239 | }))[1], (setmetatable({ | ||
| 240 | 'abc', | ||
| 241 | a = 123, | ||
| 242 | }, { | ||
| 243 | __call = function(self) | ||
| 244 | return 998 | ||
| 245 | end | ||
| 246 | })).a, (setmetatable({ | ||
| 247 | 'abc', | ||
| 248 | a = 123, | ||
| 249 | }, { | ||
| 250 | __call = function(self) | ||
| 251 | return 998 | ||
| 252 | end | ||
| 253 | }))(), setmetatable({ | ||
| 254 | 'abc', | ||
| 255 | a = 123, | ||
| 256 | }, { | ||
| 257 | __call = function(self) | ||
| 258 | return 998 | ||
| 259 | end | ||
| 260 | })) | ||
| 261 | print("current line: " .. tostring(259)) | ||
| 262 | -- TODO | ||
| 232 | print('abc') | 263 | print('abc') |
| 233 | return 123 | 264 | return 123 |
