rufus-lua-win 5.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (459) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +69 -0
  6. data/Rakefile +1 -0
  7. data/lib/rufus/lua/win.rb +18 -0
  8. data/lib/rufus/lua/win/version.rb +7 -0
  9. data/rufus-lua-win.gemspec +23 -0
  10. data/vendor/lua/bin/liblua.dll +0 -0
  11. data/vendor/lua/lib/lua/LuaXml.lua +119 -0
  12. data/vendor/lua/lib/lua/alien.lua +250 -0
  13. data/vendor/lua/lib/lua/alien/core.dll +0 -0
  14. data/vendor/lua/lib/lua/alien/struct.dll +0 -0
  15. data/vendor/lua/lib/lua/base.lua +536 -0
  16. data/vendor/lua/lib/lua/bin.lua +20 -0
  17. data/vendor/lua/lib/lua/bit.dll +0 -0
  18. data/vendor/lua/lib/lua/cdlua.dll +0 -0
  19. data/vendor/lua/lib/lua/cdluacontextplus.dll +0 -0
  20. data/vendor/lua/lib/lua/cdluagl.dll +0 -0
  21. data/vendor/lua/lib/lua/cdluaim.dll +0 -0
  22. data/vendor/lua/lib/lua/cdluapdf.dll +0 -0
  23. data/vendor/lua/lib/lua/copas.lua +543 -0
  24. data/vendor/lua/lib/lua/coxpcall.lua +57 -0
  25. data/vendor/lua/lib/lua/date.lua +745 -0
  26. data/vendor/lua/lib/lua/debug_ext.lua +84 -0
  27. data/vendor/lua/lib/lua/debug_init.lua +2 -0
  28. data/vendor/lua/lib/lua/des56.dll +0 -0
  29. data/vendor/lua/lib/lua/dist/config.lua +109 -0
  30. data/vendor/lua/lib/lua/dist/constraints.lua +271 -0
  31. data/vendor/lua/lib/lua/dist/depends.lua +601 -0
  32. data/vendor/lua/lib/lua/dist/git.lua +307 -0
  33. data/vendor/lua/lib/lua/dist/init.lua +278 -0
  34. data/vendor/lua/lib/lua/dist/manifest.lua +225 -0
  35. data/vendor/lua/lib/lua/dist/package.lua +583 -0
  36. data/vendor/lua/lib/lua/dist/sys.lua +367 -0
  37. data/vendor/lua/lib/lua/dist/utils.lua +130 -0
  38. data/vendor/lua/lib/lua/ex.dll +0 -0
  39. data/vendor/lua/lib/lua/fstable.lua +116 -0
  40. data/vendor/lua/lib/lua/getopt.lua +273 -0
  41. data/vendor/lua/lib/lua/git.lua +5 -0
  42. data/vendor/lua/lib/lua/git/core.dll +0 -0
  43. data/vendor/lua/lib/lua/git/objects.lua +121 -0
  44. data/vendor/lua/lib/lua/git/pack.lua +316 -0
  45. data/vendor/lua/lib/lua/git/protocol.lua +188 -0
  46. data/vendor/lua/lib/lua/git/repo.lua +283 -0
  47. data/vendor/lua/lib/lua/git/util.lua +233 -0
  48. data/vendor/lua/lib/lua/gzio.dll +0 -0
  49. data/vendor/lua/lib/lua/gzip.lua +81 -0
  50. data/vendor/lua/lib/lua/iconv.dll +0 -0
  51. data/vendor/lua/lib/lua/imlua.dll +0 -0
  52. data/vendor/lua/lib/lua/imlua_fftw.dll +0 -0
  53. data/vendor/lua/lib/lua/imlua_jp2.dll +0 -0
  54. data/vendor/lua/lib/lua/imlua_process.dll +0 -0
  55. data/vendor/lua/lib/lua/imlua_process_omp.dll +0 -0
  56. data/vendor/lua/lib/lua/io_ext.lua +115 -0
  57. data/vendor/lua/lib/lua/iuplua.dll +0 -0
  58. data/vendor/lua/lib/lua/iuplua_mglplot.dll +0 -0
  59. data/vendor/lua/lib/lua/iuplua_pplot.dll +0 -0
  60. data/vendor/lua/lib/lua/iupluacd.dll +0 -0
  61. data/vendor/lua/lib/lua/iupluacontrols.dll +0 -0
  62. data/vendor/lua/lib/lua/iupluagl.dll +0 -0
  63. data/vendor/lua/lib/lua/iupluaim.dll +0 -0
  64. data/vendor/lua/lib/lua/iupluaimglib.dll +0 -0
  65. data/vendor/lua/lib/lua/iupluatuio.dll +0 -0
  66. data/vendor/lua/lib/lua/lanes-keeper.lua +302 -0
  67. data/vendor/lua/lib/lua/lanes.lua +591 -0
  68. data/vendor/lua/lib/lua/lanes/core.dll +0 -0
  69. data/vendor/lua/lib/lua/lcs.lua +55 -0
  70. data/vendor/lua/lib/lua/lemock.lua +659 -0
  71. data/vendor/lua/lib/lua/lfs.dll +0 -0
  72. data/vendor/lua/lib/lua/list.lua +375 -0
  73. data/vendor/lua/lib/lua/logging.lua +189 -0
  74. data/vendor/lua/lib/lua/logging/console.lua +22 -0
  75. data/vendor/lua/lib/lua/logging/email.lua +44 -0
  76. data/vendor/lua/lib/lua/logging/file.lua +55 -0
  77. data/vendor/lua/lib/lua/logging/rolling_file.lua +81 -0
  78. data/vendor/lua/lib/lua/logging/socket.lua +35 -0
  79. data/vendor/lua/lib/lua/logging/sql.lua +64 -0
  80. data/vendor/lua/lib/lua/loop/base.lua +68 -0
  81. data/vendor/lua/lib/lua/loop/cached.lua +312 -0
  82. data/vendor/lua/lib/lua/loop/collection/MapWithArrayOfKeys.lua +64 -0
  83. data/vendor/lua/lib/lua/loop/collection/ObjectCache.lua +39 -0
  84. data/vendor/lua/lib/lua/loop/collection/OrderedSet.lua +164 -0
  85. data/vendor/lua/lib/lua/loop/collection/PriorityQueue.lua +86 -0
  86. data/vendor/lua/lib/lua/loop/collection/UnorderedArray.lua +32 -0
  87. data/vendor/lua/lib/lua/loop/collection/UnorderedArraySet.lua +56 -0
  88. data/vendor/lua/lib/lua/loop/compiler/Arguments.lua +108 -0
  89. data/vendor/lua/lib/lua/loop/compiler/Conditional.lua +50 -0
  90. data/vendor/lua/lib/lua/loop/compiler/Expression.lua +215 -0
  91. data/vendor/lua/lib/lua/loop/component/base.lua +221 -0
  92. data/vendor/lua/lib/lua/loop/component/contained.lua +71 -0
  93. data/vendor/lua/lib/lua/loop/component/dynamic.lua +223 -0
  94. data/vendor/lua/lib/lua/loop/component/intercepted.lua +354 -0
  95. data/vendor/lua/lib/lua/loop/component/wrapped.lua +195 -0
  96. data/vendor/lua/lib/lua/loop/debug/Inspector.lua +521 -0
  97. data/vendor/lua/lib/lua/loop/debug/Matcher.lua +192 -0
  98. data/vendor/lua/lib/lua/loop/debug/Verbose.lua +266 -0
  99. data/vendor/lua/lib/lua/loop/debug/Viewer.lua +200 -0
  100. data/vendor/lua/lib/lua/loop/multiple.lua +105 -0
  101. data/vendor/lua/lib/lua/loop/object/Exception.lua +57 -0
  102. data/vendor/lua/lib/lua/loop/object/Publisher.lua +43 -0
  103. data/vendor/lua/lib/lua/loop/object/Wrapper.lua +39 -0
  104. data/vendor/lua/lib/lua/loop/scoped.lua +585 -0
  105. data/vendor/lua/lib/lua/loop/serial/FileStream.lua +48 -0
  106. data/vendor/lua/lib/lua/loop/serial/Serializer.lua +291 -0
  107. data/vendor/lua/lib/lua/loop/serial/SocketStream.lua +51 -0
  108. data/vendor/lua/lib/lua/loop/serial/StringStream.lua +47 -0
  109. data/vendor/lua/lib/lua/loop/simple.lua +75 -0
  110. data/vendor/lua/lib/lua/loop/table.lua +71 -0
  111. data/vendor/lua/lib/lua/loop/thread/CoSocket.lua +416 -0
  112. data/vendor/lua/lib/lua/loop/thread/IOScheduler.lua +170 -0
  113. data/vendor/lua/lib/lua/loop/thread/Scheduler.lua +327 -0
  114. data/vendor/lua/lib/lua/loop/thread/SocketScheduler.lua +88 -0
  115. data/vendor/lua/lib/lua/loop/thread/Timer.lua +54 -0
  116. data/vendor/lua/lib/lua/lpeg.dll +0 -0
  117. data/vendor/lua/lib/lua/ltn12.lua +292 -0
  118. data/vendor/lua/lib/lua/luaXML_lib.dll +0 -0
  119. data/vendor/lua/lib/lua/luacurl.dll +0 -0
  120. data/vendor/lua/lib/lua/luadoc/config.lua +34 -0
  121. data/vendor/lua/lib/lua/luadoc/doclet/debug.lua +46 -0
  122. data/vendor/lua/lib/lua/luadoc/doclet/formatter.lua +84 -0
  123. data/vendor/lua/lib/lua/luadoc/doclet/html.lua +289 -0
  124. data/vendor/lua/lib/lua/luadoc/doclet/html/file.lp +113 -0
  125. data/vendor/lua/lib/lua/luadoc/doclet/html/function.lp +64 -0
  126. data/vendor/lua/lib/lua/luadoc/doclet/html/index.lp +70 -0
  127. data/vendor/lua/lib/lua/luadoc/doclet/html/luadoc.css +286 -0
  128. data/vendor/lua/lib/lua/luadoc/doclet/html/menu.lp +55 -0
  129. data/vendor/lua/lib/lua/luadoc/doclet/html/module.lp +109 -0
  130. data/vendor/lua/lib/lua/luadoc/doclet/html/table.lp +15 -0
  131. data/vendor/lua/lib/lua/luadoc/doclet/raw.lua +12 -0
  132. data/vendor/lua/lib/lua/luadoc/init.lua +58 -0
  133. data/vendor/lua/lib/lua/luadoc/lp.lua +130 -0
  134. data/vendor/lua/lib/lua/luadoc/taglet/standard.lua +495 -0
  135. data/vendor/lua/lib/lua/luadoc/taglet/standard/tags.lua +171 -0
  136. data/vendor/lua/lib/lua/luadoc/util.lua +233 -0
  137. data/vendor/lua/lib/lua/luagl.dll +0 -0
  138. data/vendor/lua/lib/lua/luaglu.dll +0 -0
  139. data/vendor/lua/lib/lua/luaidl.lua +113 -0
  140. data/vendor/lua/lib/lua/luaidl/lex.lua +793 -0
  141. data/vendor/lua/lib/lua/luaidl/pre.lua +149 -0
  142. data/vendor/lua/lib/lua/luaidl/sin.lua +3631 -0
  143. data/vendor/lua/lib/lua/luarocks/add.lua +108 -0
  144. data/vendor/lua/lib/lua/luarocks/admin_remove.lua +87 -0
  145. data/vendor/lua/lib/lua/luarocks/build.lua +330 -0
  146. data/vendor/lua/lib/lua/luarocks/build/builtin.lua +253 -0
  147. data/vendor/lua/lib/lua/luarocks/build/cmake.lua +54 -0
  148. data/vendor/lua/lib/lua/luarocks/build/command.lua +32 -0
  149. data/vendor/lua/lib/lua/luarocks/build/make.lua +92 -0
  150. data/vendor/lua/lib/lua/luarocks/cache.lua +85 -0
  151. data/vendor/lua/lib/lua/luarocks/cfg.lua +449 -0
  152. data/vendor/lua/lib/lua/luarocks/command_line.lua +163 -0
  153. data/vendor/lua/lib/lua/luarocks/deps.lua +654 -0
  154. data/vendor/lua/lib/lua/luarocks/dir.lua +69 -0
  155. data/vendor/lua/lib/lua/luarocks/download.lua +90 -0
  156. data/vendor/lua/lib/lua/luarocks/fetch.lua +321 -0
  157. data/vendor/lua/lib/lua/luarocks/fetch/cvs.lua +44 -0
  158. data/vendor/lua/lib/lua/luarocks/fetch/git.lua +81 -0
  159. data/vendor/lua/lib/lua/luarocks/fetch/git_file.lua +17 -0
  160. data/vendor/lua/lib/lua/luarocks/fetch/hg.lua +54 -0
  161. data/vendor/lua/lib/lua/luarocks/fetch/sscm.lua +42 -0
  162. data/vendor/lua/lib/lua/luarocks/fetch/svn.lua +53 -0
  163. data/vendor/lua/lib/lua/luarocks/fs.lua +40 -0
  164. data/vendor/lua/lib/lua/luarocks/fs/lua.lua +676 -0
  165. data/vendor/lua/lib/lua/luarocks/fs/unix.lua +88 -0
  166. data/vendor/lua/lib/lua/luarocks/fs/unix/tools.lua +325 -0
  167. data/vendor/lua/lib/lua/luarocks/fs/win32.lua +107 -0
  168. data/vendor/lua/lib/lua/luarocks/fs/win32/tools.lua +334 -0
  169. data/vendor/lua/lib/lua/luarocks/help.lua +101 -0
  170. data/vendor/lua/lib/lua/luarocks/index.lua +172 -0
  171. data/vendor/lua/lib/lua/luarocks/install.lua +151 -0
  172. data/vendor/lua/lib/lua/luarocks/list.lua +35 -0
  173. data/vendor/lua/lib/lua/luarocks/loader.lua +228 -0
  174. data/vendor/lua/lib/lua/luarocks/make.lua +71 -0
  175. data/vendor/lua/lib/lua/luarocks/make_manifest.lua +34 -0
  176. data/vendor/lua/lib/lua/luarocks/manif.lua +360 -0
  177. data/vendor/lua/lib/lua/luarocks/manif_core.lua +75 -0
  178. data/vendor/lua/lib/lua/luarocks/new_version.lua +141 -0
  179. data/vendor/lua/lib/lua/luarocks/pack.lua +205 -0
  180. data/vendor/lua/lib/lua/luarocks/path.lua +315 -0
  181. data/vendor/lua/lib/lua/luarocks/persist.lua +173 -0
  182. data/vendor/lua/lib/lua/luarocks/refresh_cache.lua +30 -0
  183. data/vendor/lua/lib/lua/luarocks/remove.lua +135 -0
  184. data/vendor/lua/lib/lua/luarocks/rep.lua +313 -0
  185. data/vendor/lua/lib/lua/luarocks/require.lua +6 -0
  186. data/vendor/lua/lib/lua/luarocks/search.lua +399 -0
  187. data/vendor/lua/lib/lua/luarocks/show.lua +138 -0
  188. data/vendor/lua/lib/lua/luarocks/site_config.lua +23 -0
  189. data/vendor/lua/lib/lua/luarocks/tools/patch.lua +712 -0
  190. data/vendor/lua/lib/lua/luarocks/tools/tar.lua +144 -0
  191. data/vendor/lua/lib/lua/luarocks/tools/zip.lua +245 -0
  192. data/vendor/lua/lib/lua/luarocks/type_check.lua +267 -0
  193. data/vendor/lua/lib/lua/luarocks/unpack.lua +151 -0
  194. data/vendor/lua/lib/lua/luarocks/util.lua +420 -0
  195. data/vendor/lua/lib/lua/luarocks/validate.lua +164 -0
  196. data/vendor/lua/lib/lua/luars232.dll +0 -0
  197. data/vendor/lua/lib/lua/luasql/mysql.dll +0 -0
  198. data/vendor/lua/lib/lua/luasql/postgres.dll +0 -0
  199. data/vendor/lua/lib/lua/luasql/sqlite3.dll +0 -0
  200. data/vendor/lua/lib/lua/luaunit.lua +601 -0
  201. data/vendor/lua/lib/lua/lxp.dll +0 -0
  202. data/vendor/lua/lib/lua/lxp/lom.lua +60 -0
  203. data/vendor/lua/lib/lua/math_ext.lua +27 -0
  204. data/vendor/lua/lib/lua/mbox.lua +53 -0
  205. data/vendor/lua/lib/lua/md5.lua +19 -0
  206. data/vendor/lua/lib/lua/md5/core.dll +0 -0
  207. data/vendor/lua/lib/lua/metalua.lua +0 -0
  208. data/vendor/lua/lib/lua/metalua/ast_to_string.mlua +553 -0
  209. data/vendor/lua/lib/lua/metalua/base.lua +104 -0
  210. data/vendor/lua/lib/lua/metalua/bytecode.lua +0 -0
  211. data/vendor/lua/lib/lua/metalua/clopts.mlua +204 -0
  212. data/vendor/lua/lib/lua/metalua/compiler.lua +3 -0
  213. data/vendor/lua/lib/lua/metalua/dollar.mlua +24 -0
  214. data/vendor/lua/lib/lua/metalua/extension/H-runtime.mlua +216 -0
  215. data/vendor/lua/lib/lua/metalua/extension/H.mlua +22 -0
  216. data/vendor/lua/lib/lua/metalua/extension/anaphoric.mlua +54 -0
  217. data/vendor/lua/lib/lua/metalua/extension/clist.mlua +149 -0
  218. data/vendor/lua/lib/lua/metalua/extension/continue.mlua +53 -0
  219. data/vendor/lua/lib/lua/metalua/extension/localin.mlua +2 -0
  220. data/vendor/lua/lib/lua/metalua/extension/log.mlua +39 -0
  221. data/vendor/lua/lib/lua/metalua/extension/match.mlua +374 -0
  222. data/vendor/lua/lib/lua/metalua/extension/ternary.mlua +10 -0
  223. data/vendor/lua/lib/lua/metalua/extension/trycatch.mlua +189 -0
  224. data/vendor/lua/lib/lua/metalua/extension/types-runtime.mlua +159 -0
  225. data/vendor/lua/lib/lua/metalua/extension/types.mlua +352 -0
  226. data/vendor/lua/lib/lua/metalua/extension/withdo.mlua +30 -0
  227. data/vendor/lua/lib/lua/metalua/extension/xglobal-runtime.lua +41 -0
  228. data/vendor/lua/lib/lua/metalua/extension/xglobal.mlua +20 -0
  229. data/vendor/lua/lib/lua/metalua/extension/xloop.mlua +100 -0
  230. data/vendor/lua/lib/lua/metalua/extension/xmatch.mlua +216 -0
  231. data/vendor/lua/lib/lua/metalua/metaloop.mlua +76 -0
  232. data/vendor/lua/lib/lua/metalua/mlc.lua +0 -0
  233. data/vendor/lua/lib/lua/metalua/mlc_xcall.lua +119 -0
  234. data/vendor/lua/lib/lua/metalua/mlp.lua +0 -0
  235. data/vendor/lua/lib/lua/metalua/package2.lua +101 -0
  236. data/vendor/lua/lib/lua/metalua/runtime.lua +3 -0
  237. data/vendor/lua/lib/lua/metalua/string2.lua +44 -0
  238. data/vendor/lua/lib/lua/metalua/table2.lua +372 -0
  239. data/vendor/lua/lib/lua/metalua/walk.mlua +304 -0
  240. data/vendor/lua/lib/lua/metalua/walk/bindings.mlua +41 -0
  241. data/vendor/lua/lib/lua/metalua/walk/id.mlua +186 -0
  242. data/vendor/lua/lib/lua/metalua/walk/scope.lua +54 -0
  243. data/vendor/lua/lib/lua/mime.lua +87 -0
  244. data/vendor/lua/lib/lua/mime/core.dll +0 -0
  245. data/vendor/lua/lib/lua/mobdebug.lua +1484 -0
  246. data/vendor/lua/lib/lua/modules.lua +16 -0
  247. data/vendor/lua/lib/lua/object.lua +56 -0
  248. data/vendor/lua/lib/lua/oil/Exception.lua +26 -0
  249. data/vendor/lua/lib/lua/oil/arch.lua +27 -0
  250. data/vendor/lua/lib/lua/oil/arch/basic/client.lua +29 -0
  251. data/vendor/lua/lib/lua/oil/arch/basic/common.lua +13 -0
  252. data/vendor/lua/lib/lua/oil/arch/basic/server.lua +27 -0
  253. data/vendor/lua/lib/lua/oil/arch/cooperative/common.lua +10 -0
  254. data/vendor/lua/lib/lua/oil/arch/cooperative/server.lua +16 -0
  255. data/vendor/lua/lib/lua/oil/arch/corba/client.lua +39 -0
  256. data/vendor/lua/lib/lua/oil/arch/corba/common.lua +58 -0
  257. data/vendor/lua/lib/lua/oil/arch/corba/intercepted/client.lua +9 -0
  258. data/vendor/lua/lib/lua/oil/arch/corba/intercepted/server.lua +9 -0
  259. data/vendor/lua/lib/lua/oil/arch/corba/server.lua +35 -0
  260. data/vendor/lua/lib/lua/oil/arch/ludo/byref.lua +18 -0
  261. data/vendor/lua/lib/lua/oil/arch/ludo/client.lua +19 -0
  262. data/vendor/lua/lib/lua/oil/arch/ludo/common.lua +18 -0
  263. data/vendor/lua/lib/lua/oil/arch/ludo/server.lua +19 -0
  264. data/vendor/lua/lib/lua/oil/arch/typed/client.lua +27 -0
  265. data/vendor/lua/lib/lua/oil/arch/typed/common.lua +9 -0
  266. data/vendor/lua/lib/lua/oil/arch/typed/server.lua +18 -0
  267. data/vendor/lua/lib/lua/oil/assert.lua +87 -0
  268. data/vendor/lua/lib/lua/oil/builder.lua +45 -0
  269. data/vendor/lua/lib/lua/oil/builder/basic/client.lua +31 -0
  270. data/vendor/lua/lib/lua/oil/builder/basic/common.lua +11 -0
  271. data/vendor/lua/lib/lua/oil/builder/basic/server.lua +13 -0
  272. data/vendor/lua/lib/lua/oil/builder/cooperative/common.lua +11 -0
  273. data/vendor/lua/lib/lua/oil/builder/cooperative/server.lua +11 -0
  274. data/vendor/lua/lib/lua/oil/builder/corba/client.lua +13 -0
  275. data/vendor/lua/lib/lua/oil/builder/corba/common.lua +24 -0
  276. data/vendor/lua/lib/lua/oil/builder/corba/gencode.lua +13 -0
  277. data/vendor/lua/lib/lua/oil/builder/corba/intercepted/client.lua +11 -0
  278. data/vendor/lua/lib/lua/oil/builder/corba/intercepted/server.lua +11 -0
  279. data/vendor/lua/lib/lua/oil/builder/corba/server.lua +13 -0
  280. data/vendor/lua/lib/lua/oil/builder/lua/client.lua +11 -0
  281. data/vendor/lua/lib/lua/oil/builder/lua/server.lua +12 -0
  282. data/vendor/lua/lib/lua/oil/builder/ludo/byref.lua +13 -0
  283. data/vendor/lua/lib/lua/oil/builder/ludo/client.lua +13 -0
  284. data/vendor/lua/lib/lua/oil/builder/ludo/common.lua +14 -0
  285. data/vendor/lua/lib/lua/oil/builder/ludo/server.lua +13 -0
  286. data/vendor/lua/lib/lua/oil/builder/typed/client.lua +16 -0
  287. data/vendor/lua/lib/lua/oil/builder/typed/server.lua +12 -0
  288. data/vendor/lua/lib/lua/oil/compat.lua +846 -0
  289. data/vendor/lua/lib/lua/oil/component.lua +1 -0
  290. data/vendor/lua/lib/lua/oil/corba/giop.lua +301 -0
  291. data/vendor/lua/lib/lua/oil/corba/giop/Codec.lua +1568 -0
  292. data/vendor/lua/lib/lua/oil/corba/giop/CodecGen.lua +589 -0
  293. data/vendor/lua/lib/lua/oil/corba/giop/Exception.lua +25 -0
  294. data/vendor/lua/lib/lua/oil/corba/giop/Indexer.lua +63 -0
  295. data/vendor/lua/lib/lua/oil/corba/giop/Listener.lua +343 -0
  296. data/vendor/lua/lib/lua/oil/corba/giop/Messenger.lua +228 -0
  297. data/vendor/lua/lib/lua/oil/corba/giop/Referrer.lua +180 -0
  298. data/vendor/lua/lib/lua/oil/corba/giop/Requester.lua +462 -0
  299. data/vendor/lua/lib/lua/oil/corba/idl.lua +597 -0
  300. data/vendor/lua/lib/lua/oil/corba/idl/Compiler.lua +133 -0
  301. data/vendor/lua/lib/lua/oil/corba/idl/Importer.lua +235 -0
  302. data/vendor/lua/lib/lua/oil/corba/idl/Indexer.lua +95 -0
  303. data/vendor/lua/lib/lua/oil/corba/idl/Registry.lua +1821 -0
  304. data/vendor/lua/lib/lua/oil/corba/idl/ir.lua +847 -0
  305. data/vendor/lua/lib/lua/oil/corba/idl/sysex.lua +21 -0
  306. data/vendor/lua/lib/lua/oil/corba/iiop/Profiler.lua +200 -0
  307. data/vendor/lua/lib/lua/oil/corba/intercepted/Listener.lua +158 -0
  308. data/vendor/lua/lib/lua/oil/corba/intercepted/Requester.lua +181 -0
  309. data/vendor/lua/lib/lua/oil/corba/services/event.lua +126 -0
  310. data/vendor/lua/lib/lua/oil/corba/services/event/ConsumerAdmin.lua +50 -0
  311. data/vendor/lua/lib/lua/oil/corba/services/event/EventFactory.lua +15 -0
  312. data/vendor/lua/lib/lua/oil/corba/services/event/EventQueue.lua +37 -0
  313. data/vendor/lua/lib/lua/oil/corba/services/event/ProxyPushConsumer.lua +75 -0
  314. data/vendor/lua/lib/lua/oil/corba/services/event/ProxyPushSupplier.lua +62 -0
  315. data/vendor/lua/lib/lua/oil/corba/services/event/SingleDeferredDispatcher.lua +60 -0
  316. data/vendor/lua/lib/lua/oil/corba/services/event/SingleSynchronousDispatcher.lua +39 -0
  317. data/vendor/lua/lib/lua/oil/corba/services/event/SupplierAdmin.lua +50 -0
  318. data/vendor/lua/lib/lua/oil/corba/services/naming.lua +436 -0
  319. data/vendor/lua/lib/lua/oil/kernel/base/Acceptor.lua +268 -0
  320. data/vendor/lua/lib/lua/oil/kernel/base/Channels.lua +121 -0
  321. data/vendor/lua/lib/lua/oil/kernel/base/Connector.lua +147 -0
  322. data/vendor/lua/lib/lua/oil/kernel/base/Dispatcher.lua +99 -0
  323. data/vendor/lua/lib/lua/oil/kernel/base/Proxies.lua +86 -0
  324. data/vendor/lua/lib/lua/oil/kernel/base/Proxies/asynchronous.lua +56 -0
  325. data/vendor/lua/lib/lua/oil/kernel/base/Proxies/protected.lua +17 -0
  326. data/vendor/lua/lib/lua/oil/kernel/base/Proxies/synchronous.lua +17 -0
  327. data/vendor/lua/lib/lua/oil/kernel/base/Proxies/utils.lua +29 -0
  328. data/vendor/lua/lib/lua/oil/kernel/base/Receiver.lua +110 -0
  329. data/vendor/lua/lib/lua/oil/kernel/base/Servants.lua +207 -0
  330. data/vendor/lua/lib/lua/oil/kernel/base/Sockets.lua +44 -0
  331. data/vendor/lua/lib/lua/oil/kernel/cooperative/Receiver.lua +139 -0
  332. data/vendor/lua/lib/lua/oil/kernel/intercepted/Listener.lua +47 -0
  333. data/vendor/lua/lib/lua/oil/kernel/intercepted/Requester.lua +58 -0
  334. data/vendor/lua/lib/lua/oil/kernel/lua/Dispatcher.lua +76 -0
  335. data/vendor/lua/lib/lua/oil/kernel/lua/Proxies.lua +69 -0
  336. data/vendor/lua/lib/lua/oil/kernel/typed/Dispatcher.lua +91 -0
  337. data/vendor/lua/lib/lua/oil/kernel/typed/Proxies.lua +153 -0
  338. data/vendor/lua/lib/lua/oil/kernel/typed/Servants.lua +137 -0
  339. data/vendor/lua/lib/lua/oil/ludo/Codec.lua +66 -0
  340. data/vendor/lua/lib/lua/oil/ludo/CodecByRef.lua +103 -0
  341. data/vendor/lua/lib/lua/oil/ludo/Listener.lua +151 -0
  342. data/vendor/lua/lib/lua/oil/ludo/Referrer.lua +72 -0
  343. data/vendor/lua/lib/lua/oil/ludo/Requester.lua +107 -0
  344. data/vendor/lua/lib/lua/oil/oo.lua +1 -0
  345. data/vendor/lua/lib/lua/oil/port.lua +1 -0
  346. data/vendor/lua/lib/lua/oil/properties.lua +57 -0
  347. data/vendor/lua/lib/lua/oil/verbose.lua +133 -0
  348. data/vendor/lua/lib/lua/package_ext.lua +15 -0
  349. data/vendor/lua/lib/lua/parser.lua +268 -0
  350. data/vendor/lua/lib/lua/pl/Date.lua +555 -0
  351. data/vendor/lua/lib/lua/pl/List.lua +613 -0
  352. data/vendor/lua/lib/lua/pl/Map.lua +113 -0
  353. data/vendor/lua/lib/lua/pl/MultiMap.lua +62 -0
  354. data/vendor/lua/lib/lua/pl/OrderedMap.lua +151 -0
  355. data/vendor/lua/lib/lua/pl/Set.lua +153 -0
  356. data/vendor/lua/lib/lua/pl/app.lua +165 -0
  357. data/vendor/lua/lib/lua/pl/array2d.lua +501 -0
  358. data/vendor/lua/lib/lua/pl/class.lua +180 -0
  359. data/vendor/lua/lib/lua/pl/comprehension.lua +286 -0
  360. data/vendor/lua/lib/lua/pl/config.lua +176 -0
  361. data/vendor/lua/lib/lua/pl/data.lua +606 -0
  362. data/vendor/lua/lib/lua/pl/dir.lua +475 -0
  363. data/vendor/lua/lib/lua/pl/file.lua +70 -0
  364. data/vendor/lua/lib/lua/pl/func.lua +376 -0
  365. data/vendor/lua/lib/lua/pl/init.lua +68 -0
  366. data/vendor/lua/lib/lua/pl/input.lua +173 -0
  367. data/vendor/lua/lib/lua/pl/lapp.lua +407 -0
  368. data/vendor/lua/lib/lua/pl/lexer.lua +456 -0
  369. data/vendor/lua/lib/lua/pl/luabalanced.lua +264 -0
  370. data/vendor/lua/lib/lua/pl/operator.lua +201 -0
  371. data/vendor/lua/lib/lua/pl/path.lua +398 -0
  372. data/vendor/lua/lib/lua/pl/permute.lua +63 -0
  373. data/vendor/lua/lib/lua/pl/platf/luajava.lua +101 -0
  374. data/vendor/lua/lib/lua/pl/pretty.lua +285 -0
  375. data/vendor/lua/lib/lua/pl/seq.lua +551 -0
  376. data/vendor/lua/lib/lua/pl/sip.lua +344 -0
  377. data/vendor/lua/lib/lua/pl/strict.lua +70 -0
  378. data/vendor/lua/lib/lua/pl/stringio.lua +158 -0
  379. data/vendor/lua/lib/lua/pl/stringx.lua +440 -0
  380. data/vendor/lua/lib/lua/pl/tablex.lua +817 -0
  381. data/vendor/lua/lib/lua/pl/template.lua +103 -0
  382. data/vendor/lua/lib/lua/pl/test.lua +135 -0
  383. data/vendor/lua/lib/lua/pl/text.lua +243 -0
  384. data/vendor/lua/lib/lua/pl/utils.lua +550 -0
  385. data/vendor/lua/lib/lua/pl/xml.lua +689 -0
  386. data/vendor/lua/lib/lua/profiler.dll +0 -0
  387. data/vendor/lua/lib/lua/re.lua +248 -0
  388. data/vendor/lua/lib/lua/rex_onig.dll +0 -0
  389. data/vendor/lua/lib/lua/rex_pcre.dll +0 -0
  390. data/vendor/lua/lib/lua/rex_posix.dll +0 -0
  391. data/vendor/lua/lib/lua/rings.dll +0 -0
  392. data/vendor/lua/lib/lua/serialize.lua +193 -0
  393. data/vendor/lua/lib/lua/set.lua +149 -0
  394. data/vendor/lua/lib/lua/socket.lua +133 -0
  395. data/vendor/lua/lib/lua/socket/core.dll +0 -0
  396. data/vendor/lua/lib/lua/socket/ftp.lua +281 -0
  397. data/vendor/lua/lib/lua/socket/http.lua +350 -0
  398. data/vendor/lua/lib/lua/socket/smtp.lua +251 -0
  399. data/vendor/lua/lib/lua/socket/tp.lua +123 -0
  400. data/vendor/lua/lib/lua/socket/url.lua +297 -0
  401. data/vendor/lua/lib/lua/ssl.dll +0 -0
  402. data/vendor/lua/lib/lua/ssl.lua +93 -0
  403. data/vendor/lua/lib/lua/ssl/https.lua +138 -0
  404. data/vendor/lua/lib/lua/stable.lua +28 -0
  405. data/vendor/lua/lib/lua/std.lua +16 -0
  406. data/vendor/lua/lib/lua/strbuf.lua +32 -0
  407. data/vendor/lua/lib/lua/strict.lua +45 -0
  408. data/vendor/lua/lib/lua/string_ext.lua +274 -0
  409. data/vendor/lua/lib/lua/table_ext.lua +117 -0
  410. data/vendor/lua/lib/lua/tar.lua +262 -0
  411. data/vendor/lua/lib/lua/task.dll +0 -0
  412. data/vendor/lua/lib/lua/tree.lua +81 -0
  413. data/vendor/lua/lib/lua/unicode.dll +0 -0
  414. data/vendor/lua/lib/lua/verbose_require.lua +11 -0
  415. data/vendor/lua/lib/lua/vstruct.lua +86 -0
  416. data/vendor/lua/lib/lua/vstruct/ast.lua +192 -0
  417. data/vendor/lua/lib/lua/vstruct/ast/Bitpack.lua +33 -0
  418. data/vendor/lua/lib/lua/vstruct/ast/Generator.lua +174 -0
  419. data/vendor/lua/lib/lua/vstruct/ast/IO.lua +45 -0
  420. data/vendor/lua/lib/lua/vstruct/ast/List.lua +56 -0
  421. data/vendor/lua/lib/lua/vstruct/ast/Name.lua +20 -0
  422. data/vendor/lua/lib/lua/vstruct/ast/Repeat.lua +23 -0
  423. data/vendor/lua/lib/lua/vstruct/ast/Root.lua +19 -0
  424. data/vendor/lua/lib/lua/vstruct/ast/Table.lua +65 -0
  425. data/vendor/lua/lib/lua/vstruct/cursor.lua +81 -0
  426. data/vendor/lua/lib/lua/vstruct/io.lua +45 -0
  427. data/vendor/lua/lib/lua/vstruct/io/a.lua +24 -0
  428. data/vendor/lua/lib/lua/vstruct/io/b.lua +28 -0
  429. data/vendor/lua/lib/lua/vstruct/io/bigendian.lua +21 -0
  430. data/vendor/lua/lib/lua/vstruct/io/c.lua +25 -0
  431. data/vendor/lua/lib/lua/vstruct/io/defaults.lua +24 -0
  432. data/vendor/lua/lib/lua/vstruct/io/endianness.lua +41 -0
  433. data/vendor/lua/lib/lua/vstruct/io/f.lua +129 -0
  434. data/vendor/lua/lib/lua/vstruct/io/hostendian.lua +21 -0
  435. data/vendor/lua/lib/lua/vstruct/io/i.lua +42 -0
  436. data/vendor/lua/lib/lua/vstruct/io/littleendian.lua +21 -0
  437. data/vendor/lua/lib/lua/vstruct/io/m.lua +62 -0
  438. data/vendor/lua/lib/lua/vstruct/io/p.lua +23 -0
  439. data/vendor/lua/lib/lua/vstruct/io/s.lua +27 -0
  440. data/vendor/lua/lib/lua/vstruct/io/seekb.lua +18 -0
  441. data/vendor/lua/lib/lua/vstruct/io/seekf.lua +18 -0
  442. data/vendor/lua/lib/lua/vstruct/io/seekto.lua +18 -0
  443. data/vendor/lua/lib/lua/vstruct/io/u.lua +54 -0
  444. data/vendor/lua/lib/lua/vstruct/io/x.lua +34 -0
  445. data/vendor/lua/lib/lua/vstruct/io/z.lua +63 -0
  446. data/vendor/lua/lib/lua/vstruct/lexer.lua +100 -0
  447. data/vendor/lua/lib/lua/vstruct/pack.lua +142 -0
  448. data/vendor/lua/lib/lua/vstruct/test.lua +47 -0
  449. data/vendor/lua/lib/lua/vstruct/test/basic.lua +73 -0
  450. data/vendor/lua/lib/lua/vstruct/test/common.lua +100 -0
  451. data/vendor/lua/lib/lua/vstruct/test/fp-bigendian.lua +56 -0
  452. data/vendor/lua/lib/lua/vstruct/test/fp-littleendian.lua +56 -0
  453. data/vendor/lua/lib/lua/vstruct/test/struct-test-gen.lua +1230 -0
  454. data/vendor/lua/lib/lua/vstruct/unpack.lua +126 -0
  455. data/vendor/lua/lib/lua/wx.dll +0 -0
  456. data/vendor/lua/lib/lua/xml.lua +75 -0
  457. data/vendor/lua/lib/lua/zip.dll +0 -0
  458. data/vendor/lua/lib/lua/zlib.dll +0 -0
  459. metadata +529 -0
@@ -0,0 +1,22 @@
1
+ require 'metalua.walk.id'
2
+ -{ extension 'log' }
3
+
4
+ mlp.expr.prefix:add{ '!', prec = 5,
5
+ builder = function(_,x)
6
+ local v = mlp.gensym()
7
+ return `Stat{ +{ block:
8
+ local -{v} = -{x};
9
+ (-{v}).h_boundary=true },
10
+ v }
11
+ end }
12
+
13
+ mlp.stat:add{ '!', mlp.expr, builder = |x| +{stat: (-{x[1]}).h_boundary=true } }
14
+
15
+ -- * if there's no boundary in it, is there a need to rename vars?
16
+ -- ==> first pass to mark binders which contain boundaries,
17
+ -- then 2nd pass only touched those which have a splice
18
+ -- in them.
19
+
20
+ return +{ require (-{ `String{ package.metalua_extension_prefix .. 'H-runtime' } }) }
21
+
22
+
@@ -0,0 +1,54 @@
1
+ --------------------------------------------------------------------------------
2
+ --
3
+ -- Anaphoric macros.
4
+ --
5
+ -- This extension turns 'it' into a special variable, that's bound to
6
+ -- an often used value:
7
+ --
8
+ -- * in an 'if' statement, 'it' is bound, in a block, to the condition
9
+ -- that triggered the block's execution:
10
+ -- > if 1234 then y=it end; assert (y == 1234)
11
+ --
12
+ -- * in a while loop, it's bound to the test:
13
+ -- > while file:read "*a" do table.insert (lines, it) end
14
+ --
15
+ -- 'it' is bound the the most closely surrounding structure. If you wanted to
16
+ -- use its content at a deeper position in the AST, you would have to save it
17
+ -- in a temporary variable. But what you should really do in such a case is
18
+ -- avoiding to use anaphoric macros: they're fine for one-liner, but they
19
+ -- reduce readability for bigger functions.
20
+ --------------------------------------------------------------------------------
21
+
22
+ -- TODO: 'and' operator could, and maybe should, be anaphoric as well
23
+ -- TODO: anaphoric functions would be cool for recursive functions, but
24
+ -- recursive calls are always in an 'if' statement, so the pronoun
25
+ -- used for functions must not be the same as for 'if'.
26
+
27
+ require 'freevars'
28
+
29
+ local function anaphoric_if(ast)
30
+ local it_found = false
31
+ for i=2, #ast do
32
+ if freevars.block(ast[i])['it'] then
33
+ it_found = true
34
+ break
35
+ end
36
+ end
37
+ if it_found then
38
+ local cond = ast[1]
39
+ ast[1] = +{it}
40
+ return +{stat: do local it = -{cond}; -{ast} end }
41
+ end
42
+ end
43
+
44
+ local function anaphoric_while(ast)
45
+ local it_found = false
46
+ if freevars.block(ast[2])['it'] then
47
+ local cond = ast[1]
48
+ ast[1] = +{it}
49
+ return +{stat: do local it = -{cond}; -{ast} end }
50
+ end
51
+ end
52
+
53
+ mlp.stat:get'if'.transformers:add(anaphoric_if)
54
+ mlp.stat:get'while'.transformers:add(anaphoric_while)
@@ -0,0 +1,149 @@
1
+ ----------------------------------------------------------------------
2
+ -- Metalua samples: $Id$
3
+ --
4
+ -- Summary: Lists by comprehension
5
+ --
6
+ ----------------------------------------------------------------------
7
+ --
8
+ -- Copyright (c) 2006-2007, Fabien Fleutot <metalua@gmail.com>.
9
+ --
10
+ -- This software is released under the MIT Licence, see licence.txt
11
+ -- for details.
12
+ --
13
+ --------------------------------------------------------------------------------
14
+ --
15
+ -- This extension implements list comprehensions, similar to Haskell and
16
+ -- Python syntax, to easily describe lists.
17
+ --
18
+ --------------------------------------------------------------------------------
19
+
20
+ -{ extension "match" }
21
+
22
+ local function dots_builder (x) return `Dots{ x } end
23
+
24
+ local function for_builder (x, h)
25
+ match x with
26
+ | `Comp{ _, acc } -> table.insert (acc, h[1]); return x
27
+ | `Pair{ _, _ } -> error "No explicit key in a for list generator"
28
+ | _ -> return `Comp{ x, {h[1]} }
29
+ end
30
+ end
31
+
32
+ local function if_builder (x, p)
33
+ match x with
34
+ | `Comp{ _, acc } -> table.insert (acc, `If{ p[1] }); return x
35
+ | `Pair{ _, _ } -> error "No explicit key in a list guard"
36
+ | _ -> return `Comp{ x, p[1] }
37
+ end
38
+ end
39
+
40
+ local function comp_builder(core, list, no_unpack)
41
+ -- [ti] = temp var holding table.insert
42
+ -- [v] = variable holding the table being built
43
+ -- [r] = the core of the list being built
44
+ local ti, v, r = mlp.gensym "table_insert", mlp.gensym "table"
45
+
46
+ -----------------------------------------------------------------------------
47
+ -- 1 - Build the loop's core: if it has suffix "...", every elements of the
48
+ -- multi-return must be inserted, hence the extra [for] loop.
49
+ -----------------------------------------------------------------------------
50
+ match core with
51
+ | `Dots{ x } ->
52
+ local w = mlp.gensym()
53
+ r = +{stat: for -{w} in values( -{x} ) do -{ `Call{ ti, v, w } } end }
54
+ | `Pair{ k, w } ->
55
+ r = `Set{ { `Index{ v, k } }, { w } }
56
+ | _ -> r = `Call{ ti, v, core }
57
+ end
58
+
59
+ -----------------------------------------------------------------------------
60
+ -- 2 - Stack the if and for control structures, from outside to inside.
61
+ -- This is done in a destructive way for the elements of [list].
62
+ -----------------------------------------------------------------------------
63
+ for i = #list, 1, -1 do
64
+ table.insert (list[i], {r})
65
+ r = list[i]
66
+ end
67
+ if no_unpack then
68
+ return `Stat{ { `Local{ {ti, v}, { +{table.insert}, `Table} }, r }, v }
69
+ else
70
+ return +{ function()
71
+ local -{ti}, -{v} = table.insert, { }
72
+ -{r}; return unpack(-{v})
73
+ end () }
74
+ end
75
+ end
76
+
77
+ local function table_content_builder (list)
78
+ match list with
79
+ | { `Comp{ y, acc } } -> return comp_builder( y, acc, "no unpack")
80
+ | _ ->
81
+ local tables = { `Table }
82
+ local ctable = tables[1]
83
+ local function flush() ctable=`Table; table.insert(tables, ctable) end
84
+ for x in values(list) do
85
+ match x with
86
+ | `Comp{ y, acc } -> table.insert(ctable, comp_builder(y, acc)); flush()
87
+ | `Dots{ y } -> table.insert(ctable, y); flush()
88
+ | _ -> table.insert (ctable, x);
89
+ end
90
+ end
91
+ match tables with
92
+ | { x } | { x, { } } -> return x
93
+ | _ ->
94
+ if #tables[#tables]==0 then table.remove(tables) end --suppress empty table
95
+ return `Call{ +{table.cat}, unpack(tables) }
96
+ end
97
+ end
98
+ end
99
+
100
+ mlp.table_field = gg.expr{ name="table cell",
101
+ primary = mlp.table_field,
102
+ suffix = { name="table cell suffix",
103
+ { "...", builder = dots_builder },
104
+ { "for", mlp.for_header, builder = for_builder },
105
+ { "if", mlp.expr, builder = if_builder } } }
106
+
107
+ mlp.table_content.builder = table_content_builder
108
+
109
+ --[[
110
+ mlp.stat:add{ "for", gg.expr {
111
+ primary = for_header,
112
+ suffix = {
113
+ { "for", mlp.for_header, builder = for_builder },
114
+ { "if", mlp.expr, builder = if_builder } } },
115
+ "do", mlp.block, "end", builder = for_stat_builder }
116
+ --]]
117
+
118
+ --------------------------------------------------------------------------------
119
+ -- Back-end for improved index operator.
120
+ --------------------------------------------------------------------------------
121
+ local function index_builder(a, suffix)
122
+ match suffix[1] with
123
+ -- Single index, no range: keep the native semantics
124
+ | { { e, false } } -> return `Index{ a, e }
125
+ -- Either a range, or multiple indexes, or both
126
+ | ranges ->
127
+ local r = `Call{ +{table.isub}, a }
128
+ local function acc (x,y) table.insert (r,x); table.insert (r,y) end
129
+ for seq in ivalues (ranges) do
130
+ match seq with
131
+ | { e, false } -> acc(e,e)
132
+ | { e, f } -> acc(e,f)
133
+ end
134
+ end
135
+ return r
136
+ end
137
+ end
138
+
139
+ --------------------------------------------------------------------------------
140
+ -- Improved "[...]" index operator:
141
+ -- * support for multi-indexes ("foo[bar, gnat]")
142
+ -- * support for ranges ("foo[bar ... gnat]")
143
+ --------------------------------------------------------------------------------
144
+ mlp.expr.suffix:del '['
145
+ mlp.expr.suffix:add{ name="table index/range",
146
+ "[", gg.list{
147
+ gg.sequence { mlp.expr, gg.onkeyword{ "...", mlp.expr } } ,
148
+ separators = { ",", ";" } },
149
+ "]", builder = index_builder }
@@ -0,0 +1,53 @@
1
+ require "metalua.walk"
2
+
3
+ ----------------------------------------------------------------------
4
+ -- * [loop_tags] are the tags of statements which support continue.
5
+ -- * [loop_keywords] are the initial keywords which trigger the parsing
6
+ -- of these statements: they're indeed indexed by keyword in [mlp.stat].
7
+ ----------------------------------------------------------------------
8
+
9
+ local loop_tags = table.transpose{ "Forin", "Fornum", "While", "Repeat" }
10
+ local loop_keywords = { "for", "while", "repeat" }
11
+
12
+ ----------------------------------------------------------------------
13
+ -- This function takes the AST of a continue-enabled loop, parse
14
+ -- its body to find all instances of [`Continue]. If any of them
15
+ -- is found ([label~=nil]), they're transformed in [`Goto{...}], and
16
+ -- the corresponding label is added at the end of the loop's body.
17
+ --
18
+ -- Caveat: if a [continue] appears in the non-body part of a loop
19
+ -- (and therefore is relative to some enclosing loop), it isn't
20
+ -- handled, and therefore causes a compilation error. This could
21
+ -- only happen due in a [`Stat{ }], however, since [`Function{ }]
22
+ -- cuts the search for [`Continue].
23
+ ----------------------------------------------------------------------
24
+ local function loop_transformer (ast)
25
+ local label
26
+ local cfg = { stat = { }; expr = { } }
27
+
28
+ function cfg.stat.down (x)
29
+ if loop_tags[x.tag] then return 'break'
30
+ elseif x.tag=='Continue' then
31
+ if not label then label = mlp.gensym 'continue' end
32
+ x <- `Goto{ label }
33
+ end
34
+ end
35
+
36
+ function cfg.expr.down (x)
37
+ return x.tag=='Function' and 'break'
38
+ end
39
+
40
+ local loop_body = ast.tag=="Repeat" and ast[1] or ast[#ast]
41
+ walk.block (cfg, loop_body)
42
+ if label then table.insert (loop_body, `Label{ label }) end
43
+ end
44
+
45
+ ----------------------------------------------------------------------
46
+ -- Register the transformer for each kind of loop:
47
+ ----------------------------------------------------------------------
48
+ for keyword in values (loop_keywords) do
49
+ mlp.stat:get(keyword).transformers:add (loop_transformer)
50
+ end
51
+
52
+ mlp.lexer:add "continue"
53
+ mlp.stat:add{ "continue", builder = ||`Continue }
@@ -0,0 +1,2 @@
1
+ mlp.expr:add{ "local", mlp.id, "=", mlp.expr, "in", mlp.expr,
2
+ builder=|x| `Stat{ { `Local{ { x[1] }, { x[2] } } }, x[3] } }
@@ -0,0 +1,39 @@
1
+ require 'metalua.dollar'
2
+
3
+ -{ extension 'match' }
4
+
5
+ function dollar.log(...)
6
+ local args = {...}
7
+ local ti = table.insert
8
+ local code = { }
9
+ local nohash = false
10
+ local width = 80
11
+
12
+ local i=1
13
+ if args[i].tag=='String' then
14
+ ti(code, +{print(" [LOG] "..-{args[1]})})
15
+ i += 1
16
+ end
17
+
18
+ local xtra_args, names, vals = { }, { }, { }
19
+ for i=i, #args do
20
+ match args[i] with
21
+ | +{ 'nohash' } -> nohash = true
22
+ | `Number{ w } -> width = w
23
+ --| `String{...} | `Number{...} -> ti (xtra_args, args[i])
24
+ | `Id{n} -> ti (names, n); ti (vals, args[i])
25
+ | x -> ti (names, table.tostring(x, 'nohash')); ti (vals, x)
26
+ end
27
+ end
28
+
29
+ for i=1, #names do
30
+ local msg = string.format(" [LOG] %s = ", names[i])
31
+ local printer = `Call{ +{table.tostring},
32
+ vals[i],
33
+ `Number{ width },
34
+ `Number{ #msg } }
35
+ if nohash then ti(printer, +{'nohash'}) end
36
+ ti (code, `Call{ +{printf}, +{"%s%s"}, `String{ msg }, printer })
37
+ end
38
+ return code
39
+ end
@@ -0,0 +1,374 @@
1
+ ----------------------------------------------------------------------
2
+ -- Metalua samples: $Id$
3
+ --
4
+ -- Summary: Structural pattern matching for metalua ADT.
5
+ --
6
+ ----------------------------------------------------------------------
7
+ --
8
+ -- Copyright (c) 2006-2008, Fabien Fleutot <metalua@gmail.com>.
9
+ --
10
+ -- This software is released under the MIT Licence, see licence.txt
11
+ -- for details.
12
+ --
13
+ --------------------------------------------------------------------------------
14
+ --
15
+ -- Glossary:
16
+ --
17
+ -- * term_seq: the tested stuff, a sequence of terms
18
+ -- * pattern_element: might match one term of a term seq. Represented
19
+ -- as expression ASTs.
20
+ -- * pattern_seq: might match a term_seq
21
+ -- * pattern_group: several pattern seqs, one of them might match
22
+ -- the term seq.
23
+ -- * case: pattern_group * guard option * block
24
+ -- * match_statement: tested term_seq * case list
25
+ --
26
+ -- Hence a complete match statement is a:
27
+ --
28
+ -- { list(expr), list{ list(list(expr)), expr or false, block } }
29
+ --
30
+ -- Implementation hints
31
+ -- ====================
32
+ --
33
+ -- The implementation is made as modular as possible, so that parts
34
+ -- can be reused in other extensions. The priviledged way to share
35
+ -- contextual information across functions is through the 'cfg' table
36
+ -- argument. Its fields include:
37
+ --
38
+ -- * code: code generated from pattern. A pattern_(element|seq|group)
39
+ -- is compiled as a sequence of instructions which will jump to
40
+ -- label [cfg.on_failure] if the tested term doesn't match.
41
+ --
42
+ -- * on_failure: name of the label where the code will jump if the
43
+ -- pattern doesn't match
44
+ --
45
+ -- * locals: names of local variables used by the pattern. This
46
+ -- includes bound variables, and temporary variables used to
47
+ -- destructure tables. Names are stored as keys of the table,
48
+ -- values are meaningless.
49
+ --
50
+ -- * after_success: label where the code must jump after a pattern
51
+ -- succeeded to capture a term, and the guard suceeded if there is
52
+ -- any, and the conditional block has run.
53
+ --
54
+ -- * ntmp: number of temporary variables used to destructurate table
55
+ -- in the current case.
56
+ --
57
+ -- Code generation is performed by acc_xxx() functions, which accumulate
58
+ -- code in cfg.code:
59
+ --
60
+ -- * acc_test(test, cfg) will generate a jump to cfg.on_failure
61
+ -- *when the test returns TRUE*
62
+ --
63
+ -- * acc_stat accumulates a statement
64
+ --
65
+ -- * acc_assign accumulate an assignment statement, and makes sure that
66
+ -- the LHS variable the registered as local in cfg.locals.
67
+ --
68
+ ----------------------------------------------------------------------
69
+
70
+ -- TODO: hygiene wrt type()
71
+ -- TODO: cfg.ntmp isn't reset as often as it could. I'm not even sure
72
+ -- the corresponding locals are declared.
73
+
74
+ module ('spmatch', package.seeall)
75
+
76
+ ----------------------------------------------------------------------
77
+ -- This would have been best done through library 'metalua.walk',
78
+ -- but walk depends on match, so we have to break the dependency.
79
+ -- It replaces all instances of `...' in `ast' with `term', unless
80
+ -- it appears in a function.
81
+ ----------------------------------------------------------------------
82
+ function replace_dots (ast, term)
83
+ local function rec (x)
84
+ if type(x) == 'table' then
85
+ if x.tag=='Dots' then
86
+ if term=='ambiguous' then
87
+ error ("You can't use `...' on the right of a match case when it appears "..
88
+ "more than once on the left")
89
+ else
90
+ x <- term
91
+ end
92
+ elseif x.tag=='Function' then return
93
+ else for y in ivalues (x) do rec (y) end end
94
+ end
95
+ end
96
+ return rec (ast)
97
+ end
98
+
99
+ tmpvar_base = mlp.gensym 'submatch.' [1]
100
+ function next_tmpvar(cfg)
101
+ assert (cfg.ntmp, "No cfg.ntmp imbrication level in the match compiler")
102
+ cfg.ntmp = cfg.ntmp+1
103
+ return `Id{ tmpvar_base .. cfg.ntmp }
104
+ end
105
+
106
+ -- Code accumulators
107
+ acc_stat = |x,cfg| table.insert (cfg.code, x)
108
+ acc_test = |x,cfg| acc_stat(+{stat: if -{x} then -{`Goto{cfg.on_failure}} end}, cfg)
109
+ -- lhs :: `Id{ string }
110
+ -- rhs :: expr
111
+ function acc_assign (lhs, rhs, cfg)
112
+ assert(lhs.tag=='Id')
113
+ cfg.locals[lhs[1]] = true
114
+ acc_stat (`Set{ {lhs}, {rhs} }, cfg)
115
+ end
116
+
117
+ literal_tags = table.transpose{ 'String', 'Number', 'True', 'False', 'Nil' }
118
+
119
+ -- pattern :: `Id{ string }
120
+ -- term :: expr
121
+ function id_pattern_element_builder (pattern, term, cfg)
122
+ assert (pattern.tag == "Id")
123
+ if pattern[1] == "_" then
124
+ -- "_" is used as a dummy var ==> no assignment, no == checking
125
+ cfg.locals._ = true
126
+ elseif cfg.locals[pattern[1]] then
127
+ -- This var is already bound ==> test for equality
128
+ acc_test (+{ -{term} ~= -{pattern} }, cfg)
129
+ else
130
+ -- Free var ==> bind it, and remember it for latter linearity checking
131
+ acc_assign (pattern, term, cfg)
132
+ cfg.locals[pattern[1]] = true
133
+ end
134
+ end
135
+
136
+ -- Concatenate code in [cfg.code], that will jump to label
137
+ -- [cfg.on_failure] if [pattern] doesn't match [term]. [pattern]
138
+ -- should be an identifier, or at least cheap to compute and
139
+ -- side-effects free.
140
+ --
141
+ -- pattern :: pattern_element
142
+ -- term :: expr
143
+ function pattern_element_builder (pattern, term, cfg)
144
+ if literal_tags[pattern.tag] then
145
+ acc_test (+{ -{term} ~= -{pattern} }, cfg)
146
+ elseif "Id" == pattern.tag then
147
+ id_pattern_element_builder (pattern, term, cfg)
148
+ elseif "Op" == pattern.tag and "div" == pattern[1] then
149
+ regexp_pattern_element_builder (pattern, term, cfg)
150
+ elseif "Op" == pattern.tag and "eq" == pattern[1] then
151
+ eq_pattern_element_builder (pattern, term, cfg)
152
+ elseif "Table" == pattern.tag then
153
+ table_pattern_element_builder (pattern, term, cfg)
154
+ else
155
+ error ("Invalid pattern: "..table.tostring(pattern, "nohash"))
156
+ end
157
+ end
158
+
159
+ function eq_pattern_element_builder (pattern, term, cfg)
160
+ local _, pat1, pat2 = unpack (pattern)
161
+ local ntmp_save = cfg.ntmp
162
+ pattern_element_builder (pat1, term, cfg)
163
+ cfg.ntmp = ntmp_save
164
+ pattern_element_builder (pat2, term, cfg)
165
+ end
166
+
167
+ -- pattern :: `Op{ 'div', string, list{`Id string} or `Id{ string }}
168
+ -- term :: expr
169
+ function regexp_pattern_element_builder (pattern, term, cfg)
170
+ local op, regexp, sub_pattern = unpack(pattern)
171
+
172
+ -- Sanity checks --
173
+ assert (op=='div', "Don't know what to do with that op in a pattern")
174
+ assert (regexp.tag=="String",
175
+ "Left hand side operand for '/' in a pattern must be "..
176
+ "a literal string representing a regular expression")
177
+ if sub_pattern.tag=="Table" then
178
+ for x in ivalues(sub_pattern) do
179
+ assert (x.tag=="Id" or x.tag=='Dots',
180
+ "Right hand side operand for '/' in a pattern must be "..
181
+ "a list of identifiers")
182
+ end
183
+ else
184
+ assert (sub_pattern.tag=="Id",
185
+ "Right hand side operand for '/' in a pattern must be "..
186
+ "an identifier or a list of identifiers")
187
+ end
188
+
189
+ -- Regexp patterns can only match strings
190
+ acc_test (+{ type(-{term}) ~= 'string' }, cfg)
191
+ -- put all captures in a list
192
+ local capt_list = +{ { string.strmatch(-{term}, -{regexp}) } }
193
+ -- save them in a var_n for recursive decomposition
194
+ local v2 = next_tmpvar(cfg)
195
+ acc_stat (+{stat: local -{v2} = -{capt_list} }, cfg)
196
+ -- was capture successful?
197
+ acc_test (+{ not next (-{v2}) }, cfg)
198
+ pattern_element_builder (sub_pattern, v2, cfg)
199
+ end
200
+
201
+ -- pattern :: pattern and `Table{ }
202
+ -- term :: expr
203
+ function table_pattern_element_builder (pattern, term, cfg)
204
+ local seen_dots, len = false, 0
205
+ acc_test (+{ type( -{term} ) ~= "table" }, cfg)
206
+ for i = 1, #pattern do
207
+ local key, sub_pattern
208
+ if pattern[i].tag=="Pair" then -- Explicit key/value pair
209
+ key, sub_pattern = unpack (pattern[i])
210
+ assert (literal_tags[key.tag], "Invalid key")
211
+ else -- Implicit key
212
+ len, key, sub_pattern = len+1, `Number{ len+1 }, pattern[i]
213
+ end
214
+
215
+ -- '...' can only appear in final position
216
+ -- Could be fixed actually...
217
+ assert (not seen_dots, "Wrongly placed `...' ")
218
+
219
+ if sub_pattern.tag == "Id" then
220
+ -- Optimization: save a useless [ v(n+1)=v(n).key ]
221
+ id_pattern_element_builder (sub_pattern, `Index{ term, key }, cfg)
222
+ if sub_pattern[1] ~= "_" then
223
+ acc_test (+{ -{sub_pattern} == nil }, cfg)
224
+ end
225
+ elseif sub_pattern.tag == "Dots" then
226
+ -- Remember where the capture is, and thatt arity checking shouldn't occur
227
+ seen_dots = true
228
+ else
229
+ -- Business as usual:
230
+ local v2 = next_tmpvar(cfg)
231
+ acc_assign (v2, `Index{ term, key }, cfg)
232
+ pattern_element_builder (sub_pattern, v2, cfg)
233
+ -- TODO: restore ntmp?
234
+ end
235
+ end
236
+ if seen_dots then -- remember how to retrieve `...'
237
+ -- FIXME: check, but there might be cases where the variable -{term}
238
+ -- will be overridden in contrieved tables.
239
+ -- ==> save it now, and clean the setting statement if unused
240
+ if cfg.dots_replacement then cfg.dots_replacement = 'ambiguous'
241
+ else cfg.dots_replacement = +{ select (-{`Number{len}}, unpack(-{term})) } end
242
+ else -- Check arity
243
+ acc_test (+{ #-{term} ~= -{`Number{len}} }, cfg)
244
+ end
245
+ end
246
+
247
+ -- Jumps to [cfg.on_faliure] if pattern_seq doesn't match
248
+ -- term_seq.
249
+ function pattern_seq_builder (pattern_seq, term_seq, cfg)
250
+ if #pattern_seq ~= #term_seq then error ("Bad seq arity") end
251
+ cfg.locals = { } -- reset bound variables between alternatives
252
+ for i=1, #pattern_seq do
253
+ cfg.ntmp = 1 -- reset the tmp var generator
254
+ pattern_element_builder(pattern_seq[i], term_seq[i], cfg)
255
+ end
256
+ end
257
+
258
+ --------------------------------------------------
259
+ -- for each case i:
260
+ -- pattern_seq_builder_i:
261
+ -- * on failure, go to on_failure_i
262
+ -- * on success, go to on_success
263
+ -- label on_success:
264
+ -- block
265
+ -- goto after_success
266
+ -- label on_failure_i
267
+ --------------------------------------------------
268
+ function case_builder (case, term_seq, cfg)
269
+ local patterns_group, guard, block = unpack(case)
270
+ local on_success = mlp.gensym 'on_success' [1]
271
+ for i = 1, #patterns_group do
272
+ local pattern_seq = patterns_group[i]
273
+ cfg.on_failure = mlp.gensym 'match_fail' [1]
274
+ cfg.dots_replacement = false
275
+ pattern_seq_builder (pattern_seq, term_seq, cfg)
276
+ if i<#patterns_group then
277
+ acc_stat (`Goto{on_success}, cfg)
278
+ acc_stat (`Label{cfg.on_failure}, cfg)
279
+ end
280
+ end
281
+ acc_stat (`Label{on_success}, cfg)
282
+ if guard then acc_test (+{not -{guard}}, cfg) end
283
+ if cfg.dots_replacement then
284
+ replace_dots (block, cfg.dots_replacement)
285
+ end
286
+ block.tag = 'Do'
287
+ acc_stat (block, cfg)
288
+ acc_stat (`Goto{cfg.after_success}, cfg)
289
+ acc_stat (`Label{cfg.on_failure}, cfg)
290
+ end
291
+
292
+ function match_builder (x)
293
+ local term_seq, cases = unpack(x)
294
+ local cfg = {
295
+ code = `Do{ },
296
+ after_success = mlp.gensym "_after_success" }
297
+
298
+
299
+ -- Some sharing issues occur when modifying term_seq,
300
+ -- so it's replaced by a copy new_term_seq.
301
+ -- TODO: clean that up, and re-suppress the useless copies
302
+ -- (cf. remarks about capture bug below).
303
+ local new_term_seq = { }
304
+
305
+ local match_locals
306
+
307
+ -- Make sure that all tested terms are variables or literals
308
+ for i=1, #term_seq do
309
+ local t = term_seq[i]
310
+ -- Capture problem: the following would compile wrongly:
311
+ -- `match x with x -> end'
312
+ -- Temporary workaround: suppress the condition, so that
313
+ -- all external variables are copied into unique names.
314
+ --if t.tag ~= 'Id' and not literal_tags[t.tag] then
315
+ local v = mlp.gensym 'v'
316
+ if not match_locals then match_locals = `Local{ {v}, {t} } else
317
+ table.insert(match_locals[1], v)
318
+ table.insert(match_locals[2], t)
319
+ end
320
+ new_term_seq[i] = v
321
+ --end
322
+ end
323
+ term_seq = new_term_seq
324
+
325
+ if match_locals then acc_stat(match_locals, cfg) end
326
+
327
+ for i=1, #cases do
328
+ local case_cfg = {
329
+ after_success = cfg.after_success,
330
+ code = `Do{ }
331
+ -- locals = { } -- unnecessary, done by pattern_seq_builder
332
+ }
333
+ case_builder (cases[i], term_seq, case_cfg)
334
+ if next (case_cfg.locals) then
335
+ local case_locals = { }
336
+ table.insert (case_cfg.code, 1, `Local{ case_locals, { } })
337
+ for v in keys (case_cfg.locals) do
338
+ table.insert (case_locals, `Id{ v })
339
+ end
340
+ end
341
+ acc_stat(case_cfg.code, cfg)
342
+ end
343
+ acc_stat(+{error 'mismatch'}, cfg)
344
+ acc_stat(`Label{cfg.after_success}, cfg)
345
+ return cfg.code
346
+ end
347
+
348
+ ----------------------------------------------------------------------
349
+ -- Syntactical front-end
350
+ ----------------------------------------------------------------------
351
+
352
+ mlp.lexer:add{ "match", "with", "->" }
353
+ mlp.block.terminators:add "|"
354
+
355
+ match_cases_list_parser = gg.list{ name = "match cases list",
356
+ gg.sequence{ name = "match case",
357
+ gg.list{ name = "match case patterns list",
358
+ primary = mlp.expr_list,
359
+ separators = "|",
360
+ terminators = { "->", "if" } },
361
+ gg.onkeyword{ "if", mlp.expr, consume = true },
362
+ "->",
363
+ mlp.block },
364
+ separators = "|",
365
+ terminators = "end" }
366
+
367
+ mlp.stat:add{ name = "match statement",
368
+ "match",
369
+ mlp.expr_list,
370
+ "with", gg.optkeyword "|",
371
+ match_cases_list_parser,
372
+ "end",
373
+ builder = |x| match_builder{ x[1], x[3] } }
374
+