rufus-lua-win 5.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +69 -0
- data/Rakefile +1 -0
- data/lib/rufus/lua/win.rb +18 -0
- data/lib/rufus/lua/win/version.rb +7 -0
- data/rufus-lua-win.gemspec +23 -0
- data/vendor/lua/bin/liblua.dll +0 -0
- data/vendor/lua/lib/lua/LuaXml.lua +119 -0
- data/vendor/lua/lib/lua/alien.lua +250 -0
- data/vendor/lua/lib/lua/alien/core.dll +0 -0
- data/vendor/lua/lib/lua/alien/struct.dll +0 -0
- data/vendor/lua/lib/lua/base.lua +536 -0
- data/vendor/lua/lib/lua/bin.lua +20 -0
- data/vendor/lua/lib/lua/bit.dll +0 -0
- data/vendor/lua/lib/lua/cdlua.dll +0 -0
- data/vendor/lua/lib/lua/cdluacontextplus.dll +0 -0
- data/vendor/lua/lib/lua/cdluagl.dll +0 -0
- data/vendor/lua/lib/lua/cdluaim.dll +0 -0
- data/vendor/lua/lib/lua/cdluapdf.dll +0 -0
- data/vendor/lua/lib/lua/copas.lua +543 -0
- data/vendor/lua/lib/lua/coxpcall.lua +57 -0
- data/vendor/lua/lib/lua/date.lua +745 -0
- data/vendor/lua/lib/lua/debug_ext.lua +84 -0
- data/vendor/lua/lib/lua/debug_init.lua +2 -0
- data/vendor/lua/lib/lua/des56.dll +0 -0
- data/vendor/lua/lib/lua/dist/config.lua +109 -0
- data/vendor/lua/lib/lua/dist/constraints.lua +271 -0
- data/vendor/lua/lib/lua/dist/depends.lua +601 -0
- data/vendor/lua/lib/lua/dist/git.lua +307 -0
- data/vendor/lua/lib/lua/dist/init.lua +278 -0
- data/vendor/lua/lib/lua/dist/manifest.lua +225 -0
- data/vendor/lua/lib/lua/dist/package.lua +583 -0
- data/vendor/lua/lib/lua/dist/sys.lua +367 -0
- data/vendor/lua/lib/lua/dist/utils.lua +130 -0
- data/vendor/lua/lib/lua/ex.dll +0 -0
- data/vendor/lua/lib/lua/fstable.lua +116 -0
- data/vendor/lua/lib/lua/getopt.lua +273 -0
- data/vendor/lua/lib/lua/git.lua +5 -0
- data/vendor/lua/lib/lua/git/core.dll +0 -0
- data/vendor/lua/lib/lua/git/objects.lua +121 -0
- data/vendor/lua/lib/lua/git/pack.lua +316 -0
- data/vendor/lua/lib/lua/git/protocol.lua +188 -0
- data/vendor/lua/lib/lua/git/repo.lua +283 -0
- data/vendor/lua/lib/lua/git/util.lua +233 -0
- data/vendor/lua/lib/lua/gzio.dll +0 -0
- data/vendor/lua/lib/lua/gzip.lua +81 -0
- data/vendor/lua/lib/lua/iconv.dll +0 -0
- data/vendor/lua/lib/lua/imlua.dll +0 -0
- data/vendor/lua/lib/lua/imlua_fftw.dll +0 -0
- data/vendor/lua/lib/lua/imlua_jp2.dll +0 -0
- data/vendor/lua/lib/lua/imlua_process.dll +0 -0
- data/vendor/lua/lib/lua/imlua_process_omp.dll +0 -0
- data/vendor/lua/lib/lua/io_ext.lua +115 -0
- data/vendor/lua/lib/lua/iuplua.dll +0 -0
- data/vendor/lua/lib/lua/iuplua_mglplot.dll +0 -0
- data/vendor/lua/lib/lua/iuplua_pplot.dll +0 -0
- data/vendor/lua/lib/lua/iupluacd.dll +0 -0
- data/vendor/lua/lib/lua/iupluacontrols.dll +0 -0
- data/vendor/lua/lib/lua/iupluagl.dll +0 -0
- data/vendor/lua/lib/lua/iupluaim.dll +0 -0
- data/vendor/lua/lib/lua/iupluaimglib.dll +0 -0
- data/vendor/lua/lib/lua/iupluatuio.dll +0 -0
- data/vendor/lua/lib/lua/lanes-keeper.lua +302 -0
- data/vendor/lua/lib/lua/lanes.lua +591 -0
- data/vendor/lua/lib/lua/lanes/core.dll +0 -0
- data/vendor/lua/lib/lua/lcs.lua +55 -0
- data/vendor/lua/lib/lua/lemock.lua +659 -0
- data/vendor/lua/lib/lua/lfs.dll +0 -0
- data/vendor/lua/lib/lua/list.lua +375 -0
- data/vendor/lua/lib/lua/logging.lua +189 -0
- data/vendor/lua/lib/lua/logging/console.lua +22 -0
- data/vendor/lua/lib/lua/logging/email.lua +44 -0
- data/vendor/lua/lib/lua/logging/file.lua +55 -0
- data/vendor/lua/lib/lua/logging/rolling_file.lua +81 -0
- data/vendor/lua/lib/lua/logging/socket.lua +35 -0
- data/vendor/lua/lib/lua/logging/sql.lua +64 -0
- data/vendor/lua/lib/lua/loop/base.lua +68 -0
- data/vendor/lua/lib/lua/loop/cached.lua +312 -0
- data/vendor/lua/lib/lua/loop/collection/MapWithArrayOfKeys.lua +64 -0
- data/vendor/lua/lib/lua/loop/collection/ObjectCache.lua +39 -0
- data/vendor/lua/lib/lua/loop/collection/OrderedSet.lua +164 -0
- data/vendor/lua/lib/lua/loop/collection/PriorityQueue.lua +86 -0
- data/vendor/lua/lib/lua/loop/collection/UnorderedArray.lua +32 -0
- data/vendor/lua/lib/lua/loop/collection/UnorderedArraySet.lua +56 -0
- data/vendor/lua/lib/lua/loop/compiler/Arguments.lua +108 -0
- data/vendor/lua/lib/lua/loop/compiler/Conditional.lua +50 -0
- data/vendor/lua/lib/lua/loop/compiler/Expression.lua +215 -0
- data/vendor/lua/lib/lua/loop/component/base.lua +221 -0
- data/vendor/lua/lib/lua/loop/component/contained.lua +71 -0
- data/vendor/lua/lib/lua/loop/component/dynamic.lua +223 -0
- data/vendor/lua/lib/lua/loop/component/intercepted.lua +354 -0
- data/vendor/lua/lib/lua/loop/component/wrapped.lua +195 -0
- data/vendor/lua/lib/lua/loop/debug/Inspector.lua +521 -0
- data/vendor/lua/lib/lua/loop/debug/Matcher.lua +192 -0
- data/vendor/lua/lib/lua/loop/debug/Verbose.lua +266 -0
- data/vendor/lua/lib/lua/loop/debug/Viewer.lua +200 -0
- data/vendor/lua/lib/lua/loop/multiple.lua +105 -0
- data/vendor/lua/lib/lua/loop/object/Exception.lua +57 -0
- data/vendor/lua/lib/lua/loop/object/Publisher.lua +43 -0
- data/vendor/lua/lib/lua/loop/object/Wrapper.lua +39 -0
- data/vendor/lua/lib/lua/loop/scoped.lua +585 -0
- data/vendor/lua/lib/lua/loop/serial/FileStream.lua +48 -0
- data/vendor/lua/lib/lua/loop/serial/Serializer.lua +291 -0
- data/vendor/lua/lib/lua/loop/serial/SocketStream.lua +51 -0
- data/vendor/lua/lib/lua/loop/serial/StringStream.lua +47 -0
- data/vendor/lua/lib/lua/loop/simple.lua +75 -0
- data/vendor/lua/lib/lua/loop/table.lua +71 -0
- data/vendor/lua/lib/lua/loop/thread/CoSocket.lua +416 -0
- data/vendor/lua/lib/lua/loop/thread/IOScheduler.lua +170 -0
- data/vendor/lua/lib/lua/loop/thread/Scheduler.lua +327 -0
- data/vendor/lua/lib/lua/loop/thread/SocketScheduler.lua +88 -0
- data/vendor/lua/lib/lua/loop/thread/Timer.lua +54 -0
- data/vendor/lua/lib/lua/lpeg.dll +0 -0
- data/vendor/lua/lib/lua/ltn12.lua +292 -0
- data/vendor/lua/lib/lua/luaXML_lib.dll +0 -0
- data/vendor/lua/lib/lua/luacurl.dll +0 -0
- data/vendor/lua/lib/lua/luadoc/config.lua +34 -0
- data/vendor/lua/lib/lua/luadoc/doclet/debug.lua +46 -0
- data/vendor/lua/lib/lua/luadoc/doclet/formatter.lua +84 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html.lua +289 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/file.lp +113 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/function.lp +64 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/index.lp +70 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/luadoc.css +286 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/menu.lp +55 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/module.lp +109 -0
- data/vendor/lua/lib/lua/luadoc/doclet/html/table.lp +15 -0
- data/vendor/lua/lib/lua/luadoc/doclet/raw.lua +12 -0
- data/vendor/lua/lib/lua/luadoc/init.lua +58 -0
- data/vendor/lua/lib/lua/luadoc/lp.lua +130 -0
- data/vendor/lua/lib/lua/luadoc/taglet/standard.lua +495 -0
- data/vendor/lua/lib/lua/luadoc/taglet/standard/tags.lua +171 -0
- data/vendor/lua/lib/lua/luadoc/util.lua +233 -0
- data/vendor/lua/lib/lua/luagl.dll +0 -0
- data/vendor/lua/lib/lua/luaglu.dll +0 -0
- data/vendor/lua/lib/lua/luaidl.lua +113 -0
- data/vendor/lua/lib/lua/luaidl/lex.lua +793 -0
- data/vendor/lua/lib/lua/luaidl/pre.lua +149 -0
- data/vendor/lua/lib/lua/luaidl/sin.lua +3631 -0
- data/vendor/lua/lib/lua/luarocks/add.lua +108 -0
- data/vendor/lua/lib/lua/luarocks/admin_remove.lua +87 -0
- data/vendor/lua/lib/lua/luarocks/build.lua +330 -0
- data/vendor/lua/lib/lua/luarocks/build/builtin.lua +253 -0
- data/vendor/lua/lib/lua/luarocks/build/cmake.lua +54 -0
- data/vendor/lua/lib/lua/luarocks/build/command.lua +32 -0
- data/vendor/lua/lib/lua/luarocks/build/make.lua +92 -0
- data/vendor/lua/lib/lua/luarocks/cache.lua +85 -0
- data/vendor/lua/lib/lua/luarocks/cfg.lua +449 -0
- data/vendor/lua/lib/lua/luarocks/command_line.lua +163 -0
- data/vendor/lua/lib/lua/luarocks/deps.lua +654 -0
- data/vendor/lua/lib/lua/luarocks/dir.lua +69 -0
- data/vendor/lua/lib/lua/luarocks/download.lua +90 -0
- data/vendor/lua/lib/lua/luarocks/fetch.lua +321 -0
- data/vendor/lua/lib/lua/luarocks/fetch/cvs.lua +44 -0
- data/vendor/lua/lib/lua/luarocks/fetch/git.lua +81 -0
- data/vendor/lua/lib/lua/luarocks/fetch/git_file.lua +17 -0
- data/vendor/lua/lib/lua/luarocks/fetch/hg.lua +54 -0
- data/vendor/lua/lib/lua/luarocks/fetch/sscm.lua +42 -0
- data/vendor/lua/lib/lua/luarocks/fetch/svn.lua +53 -0
- data/vendor/lua/lib/lua/luarocks/fs.lua +40 -0
- data/vendor/lua/lib/lua/luarocks/fs/lua.lua +676 -0
- data/vendor/lua/lib/lua/luarocks/fs/unix.lua +88 -0
- data/vendor/lua/lib/lua/luarocks/fs/unix/tools.lua +325 -0
- data/vendor/lua/lib/lua/luarocks/fs/win32.lua +107 -0
- data/vendor/lua/lib/lua/luarocks/fs/win32/tools.lua +334 -0
- data/vendor/lua/lib/lua/luarocks/help.lua +101 -0
- data/vendor/lua/lib/lua/luarocks/index.lua +172 -0
- data/vendor/lua/lib/lua/luarocks/install.lua +151 -0
- data/vendor/lua/lib/lua/luarocks/list.lua +35 -0
- data/vendor/lua/lib/lua/luarocks/loader.lua +228 -0
- data/vendor/lua/lib/lua/luarocks/make.lua +71 -0
- data/vendor/lua/lib/lua/luarocks/make_manifest.lua +34 -0
- data/vendor/lua/lib/lua/luarocks/manif.lua +360 -0
- data/vendor/lua/lib/lua/luarocks/manif_core.lua +75 -0
- data/vendor/lua/lib/lua/luarocks/new_version.lua +141 -0
- data/vendor/lua/lib/lua/luarocks/pack.lua +205 -0
- data/vendor/lua/lib/lua/luarocks/path.lua +315 -0
- data/vendor/lua/lib/lua/luarocks/persist.lua +173 -0
- data/vendor/lua/lib/lua/luarocks/refresh_cache.lua +30 -0
- data/vendor/lua/lib/lua/luarocks/remove.lua +135 -0
- data/vendor/lua/lib/lua/luarocks/rep.lua +313 -0
- data/vendor/lua/lib/lua/luarocks/require.lua +6 -0
- data/vendor/lua/lib/lua/luarocks/search.lua +399 -0
- data/vendor/lua/lib/lua/luarocks/show.lua +138 -0
- data/vendor/lua/lib/lua/luarocks/site_config.lua +23 -0
- data/vendor/lua/lib/lua/luarocks/tools/patch.lua +712 -0
- data/vendor/lua/lib/lua/luarocks/tools/tar.lua +144 -0
- data/vendor/lua/lib/lua/luarocks/tools/zip.lua +245 -0
- data/vendor/lua/lib/lua/luarocks/type_check.lua +267 -0
- data/vendor/lua/lib/lua/luarocks/unpack.lua +151 -0
- data/vendor/lua/lib/lua/luarocks/util.lua +420 -0
- data/vendor/lua/lib/lua/luarocks/validate.lua +164 -0
- data/vendor/lua/lib/lua/luars232.dll +0 -0
- data/vendor/lua/lib/lua/luasql/mysql.dll +0 -0
- data/vendor/lua/lib/lua/luasql/postgres.dll +0 -0
- data/vendor/lua/lib/lua/luasql/sqlite3.dll +0 -0
- data/vendor/lua/lib/lua/luaunit.lua +601 -0
- data/vendor/lua/lib/lua/lxp.dll +0 -0
- data/vendor/lua/lib/lua/lxp/lom.lua +60 -0
- data/vendor/lua/lib/lua/math_ext.lua +27 -0
- data/vendor/lua/lib/lua/mbox.lua +53 -0
- data/vendor/lua/lib/lua/md5.lua +19 -0
- data/vendor/lua/lib/lua/md5/core.dll +0 -0
- data/vendor/lua/lib/lua/metalua.lua +0 -0
- data/vendor/lua/lib/lua/metalua/ast_to_string.mlua +553 -0
- data/vendor/lua/lib/lua/metalua/base.lua +104 -0
- data/vendor/lua/lib/lua/metalua/bytecode.lua +0 -0
- data/vendor/lua/lib/lua/metalua/clopts.mlua +204 -0
- data/vendor/lua/lib/lua/metalua/compiler.lua +3 -0
- data/vendor/lua/lib/lua/metalua/dollar.mlua +24 -0
- data/vendor/lua/lib/lua/metalua/extension/H-runtime.mlua +216 -0
- data/vendor/lua/lib/lua/metalua/extension/H.mlua +22 -0
- data/vendor/lua/lib/lua/metalua/extension/anaphoric.mlua +54 -0
- data/vendor/lua/lib/lua/metalua/extension/clist.mlua +149 -0
- data/vendor/lua/lib/lua/metalua/extension/continue.mlua +53 -0
- data/vendor/lua/lib/lua/metalua/extension/localin.mlua +2 -0
- data/vendor/lua/lib/lua/metalua/extension/log.mlua +39 -0
- data/vendor/lua/lib/lua/metalua/extension/match.mlua +374 -0
- data/vendor/lua/lib/lua/metalua/extension/ternary.mlua +10 -0
- data/vendor/lua/lib/lua/metalua/extension/trycatch.mlua +189 -0
- data/vendor/lua/lib/lua/metalua/extension/types-runtime.mlua +159 -0
- data/vendor/lua/lib/lua/metalua/extension/types.mlua +352 -0
- data/vendor/lua/lib/lua/metalua/extension/withdo.mlua +30 -0
- data/vendor/lua/lib/lua/metalua/extension/xglobal-runtime.lua +41 -0
- data/vendor/lua/lib/lua/metalua/extension/xglobal.mlua +20 -0
- data/vendor/lua/lib/lua/metalua/extension/xloop.mlua +100 -0
- data/vendor/lua/lib/lua/metalua/extension/xmatch.mlua +216 -0
- data/vendor/lua/lib/lua/metalua/metaloop.mlua +76 -0
- data/vendor/lua/lib/lua/metalua/mlc.lua +0 -0
- data/vendor/lua/lib/lua/metalua/mlc_xcall.lua +119 -0
- data/vendor/lua/lib/lua/metalua/mlp.lua +0 -0
- data/vendor/lua/lib/lua/metalua/package2.lua +101 -0
- data/vendor/lua/lib/lua/metalua/runtime.lua +3 -0
- data/vendor/lua/lib/lua/metalua/string2.lua +44 -0
- data/vendor/lua/lib/lua/metalua/table2.lua +372 -0
- data/vendor/lua/lib/lua/metalua/walk.mlua +304 -0
- data/vendor/lua/lib/lua/metalua/walk/bindings.mlua +41 -0
- data/vendor/lua/lib/lua/metalua/walk/id.mlua +186 -0
- data/vendor/lua/lib/lua/metalua/walk/scope.lua +54 -0
- data/vendor/lua/lib/lua/mime.lua +87 -0
- data/vendor/lua/lib/lua/mime/core.dll +0 -0
- data/vendor/lua/lib/lua/mobdebug.lua +1484 -0
- data/vendor/lua/lib/lua/modules.lua +16 -0
- data/vendor/lua/lib/lua/object.lua +56 -0
- data/vendor/lua/lib/lua/oil/Exception.lua +26 -0
- data/vendor/lua/lib/lua/oil/arch.lua +27 -0
- data/vendor/lua/lib/lua/oil/arch/basic/client.lua +29 -0
- data/vendor/lua/lib/lua/oil/arch/basic/common.lua +13 -0
- data/vendor/lua/lib/lua/oil/arch/basic/server.lua +27 -0
- data/vendor/lua/lib/lua/oil/arch/cooperative/common.lua +10 -0
- data/vendor/lua/lib/lua/oil/arch/cooperative/server.lua +16 -0
- data/vendor/lua/lib/lua/oil/arch/corba/client.lua +39 -0
- data/vendor/lua/lib/lua/oil/arch/corba/common.lua +58 -0
- data/vendor/lua/lib/lua/oil/arch/corba/intercepted/client.lua +9 -0
- data/vendor/lua/lib/lua/oil/arch/corba/intercepted/server.lua +9 -0
- data/vendor/lua/lib/lua/oil/arch/corba/server.lua +35 -0
- data/vendor/lua/lib/lua/oil/arch/ludo/byref.lua +18 -0
- data/vendor/lua/lib/lua/oil/arch/ludo/client.lua +19 -0
- data/vendor/lua/lib/lua/oil/arch/ludo/common.lua +18 -0
- data/vendor/lua/lib/lua/oil/arch/ludo/server.lua +19 -0
- data/vendor/lua/lib/lua/oil/arch/typed/client.lua +27 -0
- data/vendor/lua/lib/lua/oil/arch/typed/common.lua +9 -0
- data/vendor/lua/lib/lua/oil/arch/typed/server.lua +18 -0
- data/vendor/lua/lib/lua/oil/assert.lua +87 -0
- data/vendor/lua/lib/lua/oil/builder.lua +45 -0
- data/vendor/lua/lib/lua/oil/builder/basic/client.lua +31 -0
- data/vendor/lua/lib/lua/oil/builder/basic/common.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/basic/server.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/cooperative/common.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/cooperative/server.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/corba/client.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/corba/common.lua +24 -0
- data/vendor/lua/lib/lua/oil/builder/corba/gencode.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/corba/intercepted/client.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/corba/intercepted/server.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/corba/server.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/lua/client.lua +11 -0
- data/vendor/lua/lib/lua/oil/builder/lua/server.lua +12 -0
- data/vendor/lua/lib/lua/oil/builder/ludo/byref.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/ludo/client.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/ludo/common.lua +14 -0
- data/vendor/lua/lib/lua/oil/builder/ludo/server.lua +13 -0
- data/vendor/lua/lib/lua/oil/builder/typed/client.lua +16 -0
- data/vendor/lua/lib/lua/oil/builder/typed/server.lua +12 -0
- data/vendor/lua/lib/lua/oil/compat.lua +846 -0
- data/vendor/lua/lib/lua/oil/component.lua +1 -0
- data/vendor/lua/lib/lua/oil/corba/giop.lua +301 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Codec.lua +1568 -0
- data/vendor/lua/lib/lua/oil/corba/giop/CodecGen.lua +589 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Exception.lua +25 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Indexer.lua +63 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Listener.lua +343 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Messenger.lua +228 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Referrer.lua +180 -0
- data/vendor/lua/lib/lua/oil/corba/giop/Requester.lua +462 -0
- data/vendor/lua/lib/lua/oil/corba/idl.lua +597 -0
- data/vendor/lua/lib/lua/oil/corba/idl/Compiler.lua +133 -0
- data/vendor/lua/lib/lua/oil/corba/idl/Importer.lua +235 -0
- data/vendor/lua/lib/lua/oil/corba/idl/Indexer.lua +95 -0
- data/vendor/lua/lib/lua/oil/corba/idl/Registry.lua +1821 -0
- data/vendor/lua/lib/lua/oil/corba/idl/ir.lua +847 -0
- data/vendor/lua/lib/lua/oil/corba/idl/sysex.lua +21 -0
- data/vendor/lua/lib/lua/oil/corba/iiop/Profiler.lua +200 -0
- data/vendor/lua/lib/lua/oil/corba/intercepted/Listener.lua +158 -0
- data/vendor/lua/lib/lua/oil/corba/intercepted/Requester.lua +181 -0
- data/vendor/lua/lib/lua/oil/corba/services/event.lua +126 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/ConsumerAdmin.lua +50 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/EventFactory.lua +15 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/EventQueue.lua +37 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/ProxyPushConsumer.lua +75 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/ProxyPushSupplier.lua +62 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/SingleDeferredDispatcher.lua +60 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/SingleSynchronousDispatcher.lua +39 -0
- data/vendor/lua/lib/lua/oil/corba/services/event/SupplierAdmin.lua +50 -0
- data/vendor/lua/lib/lua/oil/corba/services/naming.lua +436 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Acceptor.lua +268 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Channels.lua +121 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Connector.lua +147 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Dispatcher.lua +99 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Proxies.lua +86 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Proxies/asynchronous.lua +56 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Proxies/protected.lua +17 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Proxies/synchronous.lua +17 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Proxies/utils.lua +29 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Receiver.lua +110 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Servants.lua +207 -0
- data/vendor/lua/lib/lua/oil/kernel/base/Sockets.lua +44 -0
- data/vendor/lua/lib/lua/oil/kernel/cooperative/Receiver.lua +139 -0
- data/vendor/lua/lib/lua/oil/kernel/intercepted/Listener.lua +47 -0
- data/vendor/lua/lib/lua/oil/kernel/intercepted/Requester.lua +58 -0
- data/vendor/lua/lib/lua/oil/kernel/lua/Dispatcher.lua +76 -0
- data/vendor/lua/lib/lua/oil/kernel/lua/Proxies.lua +69 -0
- data/vendor/lua/lib/lua/oil/kernel/typed/Dispatcher.lua +91 -0
- data/vendor/lua/lib/lua/oil/kernel/typed/Proxies.lua +153 -0
- data/vendor/lua/lib/lua/oil/kernel/typed/Servants.lua +137 -0
- data/vendor/lua/lib/lua/oil/ludo/Codec.lua +66 -0
- data/vendor/lua/lib/lua/oil/ludo/CodecByRef.lua +103 -0
- data/vendor/lua/lib/lua/oil/ludo/Listener.lua +151 -0
- data/vendor/lua/lib/lua/oil/ludo/Referrer.lua +72 -0
- data/vendor/lua/lib/lua/oil/ludo/Requester.lua +107 -0
- data/vendor/lua/lib/lua/oil/oo.lua +1 -0
- data/vendor/lua/lib/lua/oil/port.lua +1 -0
- data/vendor/lua/lib/lua/oil/properties.lua +57 -0
- data/vendor/lua/lib/lua/oil/verbose.lua +133 -0
- data/vendor/lua/lib/lua/package_ext.lua +15 -0
- data/vendor/lua/lib/lua/parser.lua +268 -0
- data/vendor/lua/lib/lua/pl/Date.lua +555 -0
- data/vendor/lua/lib/lua/pl/List.lua +613 -0
- data/vendor/lua/lib/lua/pl/Map.lua +113 -0
- data/vendor/lua/lib/lua/pl/MultiMap.lua +62 -0
- data/vendor/lua/lib/lua/pl/OrderedMap.lua +151 -0
- data/vendor/lua/lib/lua/pl/Set.lua +153 -0
- data/vendor/lua/lib/lua/pl/app.lua +165 -0
- data/vendor/lua/lib/lua/pl/array2d.lua +501 -0
- data/vendor/lua/lib/lua/pl/class.lua +180 -0
- data/vendor/lua/lib/lua/pl/comprehension.lua +286 -0
- data/vendor/lua/lib/lua/pl/config.lua +176 -0
- data/vendor/lua/lib/lua/pl/data.lua +606 -0
- data/vendor/lua/lib/lua/pl/dir.lua +475 -0
- data/vendor/lua/lib/lua/pl/file.lua +70 -0
- data/vendor/lua/lib/lua/pl/func.lua +376 -0
- data/vendor/lua/lib/lua/pl/init.lua +68 -0
- data/vendor/lua/lib/lua/pl/input.lua +173 -0
- data/vendor/lua/lib/lua/pl/lapp.lua +407 -0
- data/vendor/lua/lib/lua/pl/lexer.lua +456 -0
- data/vendor/lua/lib/lua/pl/luabalanced.lua +264 -0
- data/vendor/lua/lib/lua/pl/operator.lua +201 -0
- data/vendor/lua/lib/lua/pl/path.lua +398 -0
- data/vendor/lua/lib/lua/pl/permute.lua +63 -0
- data/vendor/lua/lib/lua/pl/platf/luajava.lua +101 -0
- data/vendor/lua/lib/lua/pl/pretty.lua +285 -0
- data/vendor/lua/lib/lua/pl/seq.lua +551 -0
- data/vendor/lua/lib/lua/pl/sip.lua +344 -0
- data/vendor/lua/lib/lua/pl/strict.lua +70 -0
- data/vendor/lua/lib/lua/pl/stringio.lua +158 -0
- data/vendor/lua/lib/lua/pl/stringx.lua +440 -0
- data/vendor/lua/lib/lua/pl/tablex.lua +817 -0
- data/vendor/lua/lib/lua/pl/template.lua +103 -0
- data/vendor/lua/lib/lua/pl/test.lua +135 -0
- data/vendor/lua/lib/lua/pl/text.lua +243 -0
- data/vendor/lua/lib/lua/pl/utils.lua +550 -0
- data/vendor/lua/lib/lua/pl/xml.lua +689 -0
- data/vendor/lua/lib/lua/profiler.dll +0 -0
- data/vendor/lua/lib/lua/re.lua +248 -0
- data/vendor/lua/lib/lua/rex_onig.dll +0 -0
- data/vendor/lua/lib/lua/rex_pcre.dll +0 -0
- data/vendor/lua/lib/lua/rex_posix.dll +0 -0
- data/vendor/lua/lib/lua/rings.dll +0 -0
- data/vendor/lua/lib/lua/serialize.lua +193 -0
- data/vendor/lua/lib/lua/set.lua +149 -0
- data/vendor/lua/lib/lua/socket.lua +133 -0
- data/vendor/lua/lib/lua/socket/core.dll +0 -0
- data/vendor/lua/lib/lua/socket/ftp.lua +281 -0
- data/vendor/lua/lib/lua/socket/http.lua +350 -0
- data/vendor/lua/lib/lua/socket/smtp.lua +251 -0
- data/vendor/lua/lib/lua/socket/tp.lua +123 -0
- data/vendor/lua/lib/lua/socket/url.lua +297 -0
- data/vendor/lua/lib/lua/ssl.dll +0 -0
- data/vendor/lua/lib/lua/ssl.lua +93 -0
- data/vendor/lua/lib/lua/ssl/https.lua +138 -0
- data/vendor/lua/lib/lua/stable.lua +28 -0
- data/vendor/lua/lib/lua/std.lua +16 -0
- data/vendor/lua/lib/lua/strbuf.lua +32 -0
- data/vendor/lua/lib/lua/strict.lua +45 -0
- data/vendor/lua/lib/lua/string_ext.lua +274 -0
- data/vendor/lua/lib/lua/table_ext.lua +117 -0
- data/vendor/lua/lib/lua/tar.lua +262 -0
- data/vendor/lua/lib/lua/task.dll +0 -0
- data/vendor/lua/lib/lua/tree.lua +81 -0
- data/vendor/lua/lib/lua/unicode.dll +0 -0
- data/vendor/lua/lib/lua/verbose_require.lua +11 -0
- data/vendor/lua/lib/lua/vstruct.lua +86 -0
- data/vendor/lua/lib/lua/vstruct/ast.lua +192 -0
- data/vendor/lua/lib/lua/vstruct/ast/Bitpack.lua +33 -0
- data/vendor/lua/lib/lua/vstruct/ast/Generator.lua +174 -0
- data/vendor/lua/lib/lua/vstruct/ast/IO.lua +45 -0
- data/vendor/lua/lib/lua/vstruct/ast/List.lua +56 -0
- data/vendor/lua/lib/lua/vstruct/ast/Name.lua +20 -0
- data/vendor/lua/lib/lua/vstruct/ast/Repeat.lua +23 -0
- data/vendor/lua/lib/lua/vstruct/ast/Root.lua +19 -0
- data/vendor/lua/lib/lua/vstruct/ast/Table.lua +65 -0
- data/vendor/lua/lib/lua/vstruct/cursor.lua +81 -0
- data/vendor/lua/lib/lua/vstruct/io.lua +45 -0
- data/vendor/lua/lib/lua/vstruct/io/a.lua +24 -0
- data/vendor/lua/lib/lua/vstruct/io/b.lua +28 -0
- data/vendor/lua/lib/lua/vstruct/io/bigendian.lua +21 -0
- data/vendor/lua/lib/lua/vstruct/io/c.lua +25 -0
- data/vendor/lua/lib/lua/vstruct/io/defaults.lua +24 -0
- data/vendor/lua/lib/lua/vstruct/io/endianness.lua +41 -0
- data/vendor/lua/lib/lua/vstruct/io/f.lua +129 -0
- data/vendor/lua/lib/lua/vstruct/io/hostendian.lua +21 -0
- data/vendor/lua/lib/lua/vstruct/io/i.lua +42 -0
- data/vendor/lua/lib/lua/vstruct/io/littleendian.lua +21 -0
- data/vendor/lua/lib/lua/vstruct/io/m.lua +62 -0
- data/vendor/lua/lib/lua/vstruct/io/p.lua +23 -0
- data/vendor/lua/lib/lua/vstruct/io/s.lua +27 -0
- data/vendor/lua/lib/lua/vstruct/io/seekb.lua +18 -0
- data/vendor/lua/lib/lua/vstruct/io/seekf.lua +18 -0
- data/vendor/lua/lib/lua/vstruct/io/seekto.lua +18 -0
- data/vendor/lua/lib/lua/vstruct/io/u.lua +54 -0
- data/vendor/lua/lib/lua/vstruct/io/x.lua +34 -0
- data/vendor/lua/lib/lua/vstruct/io/z.lua +63 -0
- data/vendor/lua/lib/lua/vstruct/lexer.lua +100 -0
- data/vendor/lua/lib/lua/vstruct/pack.lua +142 -0
- data/vendor/lua/lib/lua/vstruct/test.lua +47 -0
- data/vendor/lua/lib/lua/vstruct/test/basic.lua +73 -0
- data/vendor/lua/lib/lua/vstruct/test/common.lua +100 -0
- data/vendor/lua/lib/lua/vstruct/test/fp-bigendian.lua +56 -0
- data/vendor/lua/lib/lua/vstruct/test/fp-littleendian.lua +56 -0
- data/vendor/lua/lib/lua/vstruct/test/struct-test-gen.lua +1230 -0
- data/vendor/lua/lib/lua/vstruct/unpack.lua +126 -0
- data/vendor/lua/lib/lua/wx.dll +0 -0
- data/vendor/lua/lib/lua/xml.lua +75 -0
- data/vendor/lua/lib/lua/zip.dll +0 -0
- data/vendor/lua/lib/lua/zlib.dll +0 -0
- 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,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
|
+
|