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.
- 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,10 @@
|
|
|
1
|
+
local function b(x, suffix)
|
|
2
|
+
local v, ontrue, onfalse = mlp.gensym "test", unpack (suffix)
|
|
3
|
+
return `Stat{
|
|
4
|
+
+{ block:
|
|
5
|
+
local -{v}
|
|
6
|
+
if -{x} then (-{v}) = -{ontrue} else (-{v}) = -{onfalse or `Nil} end },
|
|
7
|
+
v }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
mlp.expr.suffix:add{ "?", mlp.expr, gg.onkeyword{ ",", mlp.expr }, prec=5, builder=b }
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
-{ extension 'match' }
|
|
2
|
+
|
|
3
|
+
--------------------------------------------------------------------------------
|
|
4
|
+
--
|
|
5
|
+
-- TODO:
|
|
6
|
+
--
|
|
7
|
+
-- * Hygienize calls to pcall()
|
|
8
|
+
--
|
|
9
|
+
--------------------------------------------------------------------------------
|
|
10
|
+
|
|
11
|
+
-{ extension 'H' }
|
|
12
|
+
-{ extension 'log' }
|
|
13
|
+
|
|
14
|
+
-- Get match parsers and builder, for catch cases handling:
|
|
15
|
+
local match_alpha = require 'metalua.extension.match'
|
|
16
|
+
local H = H:new{side='inside', alpha = match_alpha }
|
|
17
|
+
|
|
18
|
+
-- We'll need to track rogue return statements:
|
|
19
|
+
require 'metalua.walk'
|
|
20
|
+
|
|
21
|
+
-- Put a block AST into a pcall():
|
|
22
|
+
local mkpcall = |block| +{pcall(function() -{block} end)}
|
|
23
|
+
|
|
24
|
+
-- The statement builder:
|
|
25
|
+
function trycatch_builder(x)
|
|
26
|
+
--$log ("trycatch_builder", x, 'nohash', 60)
|
|
27
|
+
local try_code, catch_cases, finally_code = unpack(x)
|
|
28
|
+
local insert_return_catcher = false
|
|
29
|
+
|
|
30
|
+
-- Can't be hygienize automatically by the current version of H, as
|
|
31
|
+
-- it must bridge from inside user code (hacjed return statements)
|
|
32
|
+
-- to outside macro code.
|
|
33
|
+
local caught_return = !mlp.gensym 'caught_return'
|
|
34
|
+
local saved_args
|
|
35
|
+
|
|
36
|
+
!try_code; !(finally_code or { })
|
|
37
|
+
-- FIXME: Am I sure there's no need to hygienize inside?
|
|
38
|
+
--[[if catch_cases then
|
|
39
|
+
for case in ivalues(catch_cases) do
|
|
40
|
+
--$log(case,'nohash')
|
|
41
|
+
local patterns, guard, block = unpack(case)
|
|
42
|
+
! block
|
|
43
|
+
end
|
|
44
|
+
end]]
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
----------------------------------------------------------------
|
|
48
|
+
-- Returns in the try-block must be transformed:
|
|
49
|
+
-- from the user's PoV, the code in the try-block isn't
|
|
50
|
+
-- a function, therefore a return in it must not merely
|
|
51
|
+
-- end the execution of the try block, but:
|
|
52
|
+
-- * not cause any error to be caught;
|
|
53
|
+
-- * let the finally-block be executed;
|
|
54
|
+
-- * only then, let the enclosing function return with the
|
|
55
|
+
-- appropraite values.
|
|
56
|
+
-- The way to handle that is that any returned value is stored
|
|
57
|
+
-- into the runtime variable caught_return, then a return with
|
|
58
|
+
-- no value is sent, to stop the execution of the try-code.
|
|
59
|
+
--
|
|
60
|
+
-- Similarly, a return in a catch case code must not prevent
|
|
61
|
+
-- the finally-code from being run.
|
|
62
|
+
--
|
|
63
|
+
-- This walker catches return statements and perform the relevant
|
|
64
|
+
-- transformation into caught_return setting + empty return.
|
|
65
|
+
--
|
|
66
|
+
-- There is an insert_return_catcher compile-time flag, which
|
|
67
|
+
-- allows to avoid inserting return-handling code in the result
|
|
68
|
+
-- when not needed.
|
|
69
|
+
----------------------------------------------------------------
|
|
70
|
+
local replace_returns_and_dots do
|
|
71
|
+
local function f(x)
|
|
72
|
+
match x with
|
|
73
|
+
| `Return{...} ->
|
|
74
|
+
insert_return_catcher = true
|
|
75
|
+
-- Setvar's 'caught_return' code can't be hygienize by H currently.
|
|
76
|
+
local setvar = `Set{ {caught_return}, { `Table{ unpack(x) } } }
|
|
77
|
+
x <- { setvar; `Return }; x.tag = nil;
|
|
78
|
+
--$log('transformed return stat:', x, 60)
|
|
79
|
+
return 'break'
|
|
80
|
+
| `Function{...} -> return 'break'
|
|
81
|
+
-- inside this, returns would be the nested function's, not ours.
|
|
82
|
+
| `Dots ->
|
|
83
|
+
if not saved_args then saved_args = mlp.gensym 'args' end
|
|
84
|
+
x <- `Call{ `Id 'unpack', saved_args }
|
|
85
|
+
| _ -> -- pass
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
local cfg = { stat = {down=f}, expr = {down=f} }
|
|
89
|
+
replace_returns_and_dots = |x| walk.block(cfg, x)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
-- parse returns in the try-block:
|
|
93
|
+
replace_returns_and_dots (try_code)
|
|
94
|
+
|
|
95
|
+
-- code handling the error catching process:
|
|
96
|
+
local catch_result do
|
|
97
|
+
if catch_cases and #catch_cases>0 then
|
|
98
|
+
----------------------------------------------------------
|
|
99
|
+
-- Protect catch code against failures: they run in a pcall(), and
|
|
100
|
+
-- the result is kept in catch_* vars so that it can be used to
|
|
101
|
+
-- relaunch the error after the finally code has been executed.
|
|
102
|
+
----------------------------------------------------------
|
|
103
|
+
for x in ivalues (catch_cases) do
|
|
104
|
+
local case_code = x[3]
|
|
105
|
+
-- handle rogue returns:
|
|
106
|
+
replace_returns_and_dots (case_code)
|
|
107
|
+
-- in case of error in the catch, we still need to run "finally":
|
|
108
|
+
x[3] = +{block: catch_success, catch_error = -{mkpcall(case_code)}}
|
|
109
|
+
end
|
|
110
|
+
----------------------------------------------------------
|
|
111
|
+
-- Uncaught exceptions must not cause a mismatch,
|
|
112
|
+
-- so we introduce a catch-all do-nothing last case:
|
|
113
|
+
----------------------------------------------------------
|
|
114
|
+
table.insert (catch_cases, { { { `Id '_' } }, false, { } })
|
|
115
|
+
catch_result = spmatch.match_builder{ {+{user_error}}, catch_cases }
|
|
116
|
+
else
|
|
117
|
+
catch_result = { }
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
----------------------------------------------------------------
|
|
122
|
+
-- Build the bits of code that will handle return statements
|
|
123
|
+
-- in the user code (try-block and catch-blocks).
|
|
124
|
+
----------------------------------------------------------------
|
|
125
|
+
local caught_return_init, caught_return_rethrow do
|
|
126
|
+
if insert_return_catcher then
|
|
127
|
+
caught_return_init = `Local{{caught_return}}
|
|
128
|
+
caught_return_rethrow =
|
|
129
|
+
+{stat: if -{caught_return} then return unpack(-{caught_return}) end}
|
|
130
|
+
else
|
|
131
|
+
caught_return_init, caught_return_rethrow = { }, { }
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
local saved_args_init =
|
|
136
|
+
saved_args and `Local{ {saved_args}, { `Table{`Dots} } } or { }
|
|
137
|
+
|
|
138
|
+
-- The finally code, to execute no matter what:
|
|
139
|
+
local finally_result = finally_code or { }
|
|
140
|
+
|
|
141
|
+
-- And the whole statement, gluing all taht together:
|
|
142
|
+
local result = +{stat:
|
|
143
|
+
do
|
|
144
|
+
-{ saved_args_init }
|
|
145
|
+
-{ caught_return_init }
|
|
146
|
+
local user_success, user_error = -{mkpcall(try_code)}
|
|
147
|
+
local catch_success, catch_error = false, user_error
|
|
148
|
+
if not user_success then -{catch_result} end
|
|
149
|
+
-{finally_result}
|
|
150
|
+
if not user_success and not catch_success then error(catch_error) end
|
|
151
|
+
-{ caught_return_rethrow }
|
|
152
|
+
end }
|
|
153
|
+
|
|
154
|
+
H(result)
|
|
155
|
+
|
|
156
|
+
return result
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
function catch_case_builder(x)
|
|
160
|
+
--$log ("catch_case_builder", x, 'nohash', 60)
|
|
161
|
+
local patterns, guard, _, code = unpack(x)
|
|
162
|
+
-- patterns ought to be a pattern_group, but each expression must
|
|
163
|
+
-- be converted into a single-element pattern_seq.
|
|
164
|
+
for i = 1, #patterns do patterns[i] = {patterns[i]} end
|
|
165
|
+
return { patterns, guard, code }
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
mlp.lexer:add{ 'try', 'catch', 'finally', '->' }
|
|
169
|
+
mlp.block.terminators:add{ 'catch', 'finally' }
|
|
170
|
+
|
|
171
|
+
mlp.stat:add{
|
|
172
|
+
'try',
|
|
173
|
+
mlp.block,
|
|
174
|
+
gg.onkeyword{ 'catch',
|
|
175
|
+
gg.list{
|
|
176
|
+
gg.sequence{
|
|
177
|
+
mlp.expr_list,
|
|
178
|
+
gg.onkeyword{ 'if', mlp.expr },
|
|
179
|
+
gg.optkeyword 'then',
|
|
180
|
+
mlp.block,
|
|
181
|
+
builder = catch_case_builder },
|
|
182
|
+
separators = 'catch' } },
|
|
183
|
+
gg.onkeyword{ 'finally', mlp.block },
|
|
184
|
+
'end',
|
|
185
|
+
builder = trycatch_builder }
|
|
186
|
+
|
|
187
|
+
return H.alpha
|
|
188
|
+
|
|
189
|
+
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
--------------------------------------------------------------------------------
|
|
2
|
+
-- Initialize the types table. It has an __index metatable entry,
|
|
3
|
+
-- so that if a symbol is not found in it, it is looked for in the current
|
|
4
|
+
-- environment. It allows to write things like [ n=3; x :: vector(n) ].
|
|
5
|
+
--------------------------------------------------------------------------------
|
|
6
|
+
types = { }
|
|
7
|
+
setmetatable (types, { __index = getfenv(0)})
|
|
8
|
+
|
|
9
|
+
function types.error (fmt, ...)
|
|
10
|
+
error(string.format("Runtime type-checking failure: "..fmt, ...))
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
--------------------------------------------------------------------------------
|
|
14
|
+
-- Add a prefix to an error message, if an error occurs.
|
|
15
|
+
-- Useful for type checkers that call sub-type-checkers.
|
|
16
|
+
--------------------------------------------------------------------------------
|
|
17
|
+
local function nest_error (prefix, ...)
|
|
18
|
+
local status, msg = pcall(...)
|
|
19
|
+
if not status then types.error("%s:\n%s", prefix, msg) end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
--------------------------------------------------------------------------------
|
|
23
|
+
-- Built-in types
|
|
24
|
+
--------------------------------------------------------------------------------
|
|
25
|
+
for typename in values{ "number", "string", "boolean", "function", "thread" } do
|
|
26
|
+
types[typename] =
|
|
27
|
+
function (val)
|
|
28
|
+
if type(val) ~= typename then types.error ("%s expected", typename) end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
function types.integer(val)
|
|
33
|
+
if type(val)~='number' or val%1~=0 then types.error 'integer expected' end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
--------------------------------------------------------------------------------
|
|
37
|
+
-- table(foo) checks
|
|
38
|
+
-- table(foo, bar) checks
|
|
39
|
+
-- table(i) where i is an integer checks
|
|
40
|
+
-- table(i, j) where i and j are integers checks
|
|
41
|
+
-- Integers and key/value types can be combined
|
|
42
|
+
--------------------------------------------------------------------------------
|
|
43
|
+
function types.table (...)
|
|
44
|
+
|
|
45
|
+
local key_type, val_type, range_from, range_to
|
|
46
|
+
-- arguments parsing
|
|
47
|
+
for x in values{...} do
|
|
48
|
+
if type(x) == "number" then
|
|
49
|
+
if range2 then types.error "Invalid type: too many numbers in table type"
|
|
50
|
+
elseif range1 then range2 = x
|
|
51
|
+
else range1 = x end
|
|
52
|
+
else
|
|
53
|
+
if type_key then types.error "Invalid type: too many types"
|
|
54
|
+
elseif type_val then type_key, type_val = type_val, x
|
|
55
|
+
else type_val = x end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
if not range2 then range2=range1 end
|
|
59
|
+
if not type_key then type_key = types.integer end
|
|
60
|
+
return function (val)
|
|
61
|
+
if type(val) ~= "table" then types.error "table expected" end
|
|
62
|
+
local s = #val
|
|
63
|
+
if range2 and range2 > s then types.error "Not enough table elements" end
|
|
64
|
+
if range1 and range1 < s then types.error "Too many elements table elements" end
|
|
65
|
+
for k,v in pairs(val) do
|
|
66
|
+
nest_error ("in table key", type_key, k)
|
|
67
|
+
nest_error ("in table value", type_val, v)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
--------------------------------------------------------------------------------
|
|
73
|
+
-- [list (subtype)] checks that the term is a table, and all of its
|
|
74
|
+
-- integer-indexed elements are of type [subtype].
|
|
75
|
+
--------------------------------------------------------------------------------
|
|
76
|
+
types.list = |...| types.table (types.integer, ...)
|
|
77
|
+
|
|
78
|
+
--------------------------------------------------------------------------------
|
|
79
|
+
-- Check that [x] is an integral number
|
|
80
|
+
--------------------------------------------------------------------------------
|
|
81
|
+
function types.int (x)
|
|
82
|
+
if type(x)~="number" or x%1~=0 then types.error "Integer number expected" end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
--------------------------------------------------------------------------------
|
|
86
|
+
-- [range(a,b)] checks that number [val] is between [a] and [b]. [a] and [b]
|
|
87
|
+
-- can be omitted.
|
|
88
|
+
--------------------------------------------------------------------------------
|
|
89
|
+
function types.range (a,b)
|
|
90
|
+
return function (val)
|
|
91
|
+
if type(val)~="number" or a and val<a or b and val>b then
|
|
92
|
+
types.error ("Number between %s and %s expected",
|
|
93
|
+
a and tostring(a) or "-infty",
|
|
94
|
+
b and tostring(b) or "+infty")
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
--------------------------------------------------------------------------------
|
|
100
|
+
-- [inter (x, y)] checks that the term has both types [x] and [y].
|
|
101
|
+
--------------------------------------------------------------------------------
|
|
102
|
+
function types.inter (...)
|
|
103
|
+
local args={...}
|
|
104
|
+
return function(val)
|
|
105
|
+
for t in values(args) do nest_error ("in inter type", t, args) end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
--------------------------------------------------------------------------------
|
|
110
|
+
-- [inter (x, y)] checks that the term has type either [x] or [y].
|
|
111
|
+
--------------------------------------------------------------------------------
|
|
112
|
+
function types.union (...)
|
|
113
|
+
local args={...}
|
|
114
|
+
return function(val)
|
|
115
|
+
for t in values(args) do if pcall(t, val) then return end end
|
|
116
|
+
types.error "None of the types in the union fits"
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
--------------------------------------------------------------------------------
|
|
121
|
+
-- [optional(t)] accepts values of types [t] or [nil].
|
|
122
|
+
--------------------------------------------------------------------------------
|
|
123
|
+
function types.optional(t)
|
|
124
|
+
return function(val)
|
|
125
|
+
if val~=nil then nest_error("In optional type", t, val) end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
--------------------------------------------------------------------------------
|
|
130
|
+
-- A call to this is done on litteral tables passed as types, i.e.
|
|
131
|
+
-- type {1,2,3} is transformed into types.__table{1,2,3}.
|
|
132
|
+
--------------------------------------------------------------------------------
|
|
133
|
+
function types.__table(s_type)
|
|
134
|
+
return function (s_val)
|
|
135
|
+
if type(s_val) ~= "table" then types.error "Struct table expected" end
|
|
136
|
+
for k, field_type in pairs (s_type) do
|
|
137
|
+
nest_error ("in struct field "..k, field_type, s_val[k])
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
--------------------------------------------------------------------------------
|
|
143
|
+
-- Same as __table, except that it's called on literal strings.
|
|
144
|
+
--------------------------------------------------------------------------------
|
|
145
|
+
function types.__string(s_type)
|
|
146
|
+
return function (s_val)
|
|
147
|
+
if s_val ~= s_type then
|
|
148
|
+
types.error("String %q expected", s_type)
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
--------------------------------------------------------------------------------
|
|
154
|
+
-- Top and Bottom:
|
|
155
|
+
--------------------------------------------------------------------------------
|
|
156
|
+
function types.any() end
|
|
157
|
+
function types.none() types.error "Empty type" end
|
|
158
|
+
types.__or = types.union
|
|
159
|
+
types.__and = types.inter
|
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
-- This extension inserts type-checking code at approriate place in the code,
|
|
2
|
+
-- thanks to annotations based on "::" keyword:
|
|
3
|
+
--
|
|
4
|
+
-- * function declarations can be annotated with a returned type. When they
|
|
5
|
+
-- are, type-checking code is inserted in each of their return statements,
|
|
6
|
+
-- to make sure they return the expected type.
|
|
7
|
+
--
|
|
8
|
+
-- * function parameters can also be annotated. If they are, type-checking
|
|
9
|
+
-- code is inserted in the function body, which checks the arguments' types
|
|
10
|
+
-- and cause an explicit error upon incorrect calls. Moreover, if a new value
|
|
11
|
+
-- is assigned to the parameter in the function's body, the new value's type
|
|
12
|
+
-- is checked before the assignment is performed.
|
|
13
|
+
--
|
|
14
|
+
-- * Local variables can also be annotated. If they are, type-checking
|
|
15
|
+
-- code is inserted before any value assignment or re-assignment is
|
|
16
|
+
-- performed on them.
|
|
17
|
+
--
|
|
18
|
+
-- Type checking can be disabled with:
|
|
19
|
+
--
|
|
20
|
+
-- -{stat: types.enabled = false }
|
|
21
|
+
--
|
|
22
|
+
-- Code transformation is performed at the chunk level, i.e. file by
|
|
23
|
+
-- file. Therefore, it the value of compile-time variable
|
|
24
|
+
-- [types.enabled] changes in the file, the only value that counts is
|
|
25
|
+
-- its value once the file is entirely parsed.
|
|
26
|
+
--
|
|
27
|
+
-- Syntax
|
|
28
|
+
-- ======
|
|
29
|
+
--
|
|
30
|
+
-- Syntax annotations consist of "::" followed by a type
|
|
31
|
+
-- specifier. They can appear after a function parameter name, after
|
|
32
|
+
-- the closing parameter parenthese of a function, or after a local
|
|
33
|
+
-- variable name in the declaration. See example in samples.
|
|
34
|
+
--
|
|
35
|
+
-- Type specifiers are expressions, in which identifiers are taken
|
|
36
|
+
-- from table types. For instance, [number] is transformed into
|
|
37
|
+
-- [types.number]. These [types.xxx] fields must contain functions,
|
|
38
|
+
-- which generate an error when they receive an argument which doesn't
|
|
39
|
+
-- belong to the type they represent. It is perfectly acceptible for a
|
|
40
|
+
-- type-checking function to return another type-checking function,
|
|
41
|
+
-- thus defining parametric/generic types. Parameters can be
|
|
42
|
+
-- identifiers (they're then considered as indexes in table [types])
|
|
43
|
+
-- or literals.
|
|
44
|
+
--
|
|
45
|
+
-- Design hints
|
|
46
|
+
-- ============
|
|
47
|
+
--
|
|
48
|
+
-- This extension uses the code walking library [walk] to globally
|
|
49
|
+
-- transform the chunk AST. See [chunk_transformer()] for details
|
|
50
|
+
-- about the walker.
|
|
51
|
+
--
|
|
52
|
+
-- During parsing, type informations are stored in string-indexed
|
|
53
|
+
-- fields, in the AST nodes of tags `Local and `Function. They are
|
|
54
|
+
-- used by the walker to generate code only if [types.enabled] is
|
|
55
|
+
-- true.
|
|
56
|
+
--
|
|
57
|
+
-- TODO
|
|
58
|
+
-- ====
|
|
59
|
+
--
|
|
60
|
+
-- It's easy to add global vars type-checking, by declaring :: as an
|
|
61
|
+
-- assignment operator. It's easy to add arbitrary expr
|
|
62
|
+
-- type-checking, by declaring :: as an infix operator. How to make
|
|
63
|
+
-- both cohabit?
|
|
64
|
+
|
|
65
|
+
--------------------------------------------------------------------------------
|
|
66
|
+
--
|
|
67
|
+
-- Function chunk_transformer()
|
|
68
|
+
--
|
|
69
|
+
--------------------------------------------------------------------------------
|
|
70
|
+
--
|
|
71
|
+
-- Takes a block annotated with extra fields, describing typing
|
|
72
|
+
-- constraints, and returns a normal AST where these constraints have
|
|
73
|
+
-- been turned into type-checking instructions.
|
|
74
|
+
--
|
|
75
|
+
-- It relies on the following annotations:
|
|
76
|
+
--
|
|
77
|
+
-- * [`Local{ }] statements may have a [types] field, which contains a
|
|
78
|
+
-- id name ==> type name map.
|
|
79
|
+
--
|
|
80
|
+
-- * [Function{ }] expressions may have an [param_types] field, also a
|
|
81
|
+
-- id name ==> type name map. They may also have a [ret_type] field
|
|
82
|
+
-- containing the type of the returned value.
|
|
83
|
+
--
|
|
84
|
+
-- Design hints:
|
|
85
|
+
-- =============
|
|
86
|
+
--
|
|
87
|
+
-- It relies on the code walking library, and two states:
|
|
88
|
+
--
|
|
89
|
+
-- * [return_types] is a stack of the expected return values types for
|
|
90
|
+
-- the functions currently in scope, the most deeply nested one
|
|
91
|
+
-- having the biggest index.
|
|
92
|
+
--
|
|
93
|
+
-- * [scopes] is a stack of id name ==> type name scopes, one per
|
|
94
|
+
-- currently active variables scope.
|
|
95
|
+
--
|
|
96
|
+
-- What's performed by the walker:
|
|
97
|
+
--
|
|
98
|
+
-- * Assignments to a typed variable involve a type checking of the
|
|
99
|
+
-- new value;
|
|
100
|
+
--
|
|
101
|
+
-- * Local declarations are checked for additional type declarations.
|
|
102
|
+
--
|
|
103
|
+
-- * Blocks create and destroy variable scopes in [scopes]
|
|
104
|
+
--
|
|
105
|
+
-- * Functions create an additional scope (around its body block's scope)
|
|
106
|
+
-- which retains its argument type associations, and stacks another
|
|
107
|
+
-- return type (or [false] if no type constraint is given)
|
|
108
|
+
--
|
|
109
|
+
-- * Return statements get the additional type checking statement if
|
|
110
|
+
-- applicable.
|
|
111
|
+
--
|
|
112
|
+
--------------------------------------------------------------------------------
|
|
113
|
+
|
|
114
|
+
-- TODO: unify scopes handling with free variables detector
|
|
115
|
+
-- FIXME: scopes are currently incorrect anyway, only functions currently define a scope.
|
|
116
|
+
|
|
117
|
+
require "metalua.walk"
|
|
118
|
+
|
|
119
|
+
-{ extension 'match' }
|
|
120
|
+
|
|
121
|
+
module("types", package.seeall)
|
|
122
|
+
|
|
123
|
+
enabled = true
|
|
124
|
+
|
|
125
|
+
local function chunk_transformer (block)
|
|
126
|
+
if not enabled then return end
|
|
127
|
+
local return_types, scopes = { }, { }
|
|
128
|
+
local cfg = { block = { }; stat = { }; expr = { } }
|
|
129
|
+
|
|
130
|
+
function cfg.stat.down (x)
|
|
131
|
+
match x with
|
|
132
|
+
| `Local{ lhs, rhs, types = x_types } ->
|
|
133
|
+
-- Add new types declared by lhs in current scope.
|
|
134
|
+
local myscope = scopes [#scopes]
|
|
135
|
+
for var, type in pairs (x_types) do
|
|
136
|
+
myscope [var] = process_type (type)
|
|
137
|
+
end
|
|
138
|
+
-- Type-check each rhs value with the type of the
|
|
139
|
+
-- corresponding lhs declaration, if any. Check backward, in
|
|
140
|
+
-- case a local var name is used more than once.
|
|
141
|
+
for i = 1, max (#lhs, #rhs) do
|
|
142
|
+
local type, new_val = myscope[lhs[i][1]], rhs[i]
|
|
143
|
+
if type and new_val then
|
|
144
|
+
rhs[i] = checktype_builder (type, new_val, 'expr')
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
| `Set{ lhs, rhs } ->
|
|
148
|
+
for i=1, #lhs do
|
|
149
|
+
match lhs[i] with
|
|
150
|
+
| `Id{ v } ->
|
|
151
|
+
-- Retrieve the type associated with the variable, if any:
|
|
152
|
+
local j, type = #scopes, nil
|
|
153
|
+
repeat j, type = j-1, scopes[j][v] until type or j==0
|
|
154
|
+
-- If a type constraint is found, apply it:
|
|
155
|
+
if type then rhs[i] = checktype_builder(type, rhs[i] or `Nil, 'expr') end
|
|
156
|
+
| _ -> -- assignment to a non-variable, pass
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
| `Return{ r_val } ->
|
|
160
|
+
local r_type = return_types[#return_types]
|
|
161
|
+
if r_type then
|
|
162
|
+
x <- `Return{ checktype_builder (r_type, r_val, 'expr') }
|
|
163
|
+
end
|
|
164
|
+
| _ -> -- pass
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
function cfg.expr.down (x)
|
|
169
|
+
if x.tag ~= 'Function' then return end
|
|
170
|
+
local new_scope = { }
|
|
171
|
+
table.insert (scopes, new_scope)
|
|
172
|
+
for var, type in pairs (x.param_types or { }) do
|
|
173
|
+
new_scope[var] = process_type (type)
|
|
174
|
+
end
|
|
175
|
+
local r_type = x.ret_type and process_type (x.ret_type) or false
|
|
176
|
+
table.insert (return_types, r_type)
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
-------------------------------------------------------------------
|
|
180
|
+
-- Unregister the returned type and the variable scope in which
|
|
181
|
+
-- arguments are registered;
|
|
182
|
+
-- then, adds the parameters type checking instructions at the
|
|
183
|
+
-- beginning of the function, if applicable.
|
|
184
|
+
-------------------------------------------------------------------
|
|
185
|
+
function cfg.expr.up (x)
|
|
186
|
+
if x.tag ~= 'Function' then return end
|
|
187
|
+
-- Unregister stuff going out of scope:
|
|
188
|
+
table.remove (return_types)
|
|
189
|
+
table.remove (scopes)
|
|
190
|
+
-- Add initial type checking:
|
|
191
|
+
for v, t in pairs(x.param_types or { }) do
|
|
192
|
+
table.insert(x[2], 1, checktype_builder(t, `Id{v}, 'stat'))
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
cfg.block.down = || table.insert (scopes, { })
|
|
197
|
+
cfg.block.up = || table.remove (scopes)
|
|
198
|
+
|
|
199
|
+
walk.block(cfg, block)
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
--------------------------------------------------------------------------
|
|
203
|
+
-- Perform required transformations to change a raw type expression into
|
|
204
|
+
-- a callable function:
|
|
205
|
+
--
|
|
206
|
+
-- * identifiers are changed into indexes in [types], unless they're
|
|
207
|
+
-- allready indexed, or into parentheses;
|
|
208
|
+
--
|
|
209
|
+
-- * literal tables are embedded into a call to types.__table
|
|
210
|
+
--
|
|
211
|
+
-- This transformation is not performed when type checking is disabled:
|
|
212
|
+
-- types are stored under their raw form in the AST; the transformation is
|
|
213
|
+
-- only performed when they're put in the stacks (scopes and return_types)
|
|
214
|
+
-- of the main walker.
|
|
215
|
+
--------------------------------------------------------------------------
|
|
216
|
+
function process_type (type_term)
|
|
217
|
+
-- Transform the type:
|
|
218
|
+
cfg = { expr = { } }
|
|
219
|
+
|
|
220
|
+
function cfg.expr.down(x)
|
|
221
|
+
match x with
|
|
222
|
+
| `Index{...} | `Paren{...} -> return 'break'
|
|
223
|
+
| _ -> -- pass
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
function cfg.expr.up (x)
|
|
227
|
+
match x with
|
|
228
|
+
| `Id{i} -> x <- `Index{ `Id "types", `String{ i } }
|
|
229
|
+
| `Table{...} | `String{...} | `Op{...} ->
|
|
230
|
+
local xcopy, name = table.shallow_copy(x)
|
|
231
|
+
match x.tag with
|
|
232
|
+
| 'Table' -> name = '__table'
|
|
233
|
+
| 'String' -> name = '__string'
|
|
234
|
+
| 'Op' -> name = '__'..x[1]
|
|
235
|
+
end
|
|
236
|
+
x <- `Call{ `Index{ `Id "types", `String{ name } }, xcopy }
|
|
237
|
+
| `Function{ params, { results } } if results.tag=='Return' ->
|
|
238
|
+
results.tag = nil
|
|
239
|
+
x <- `Call{ +{types.__function}, params, results }
|
|
240
|
+
| `Function{...} -> error "malformed function type"
|
|
241
|
+
| _ -> -- pass
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
walk.expr(cfg, type_term)
|
|
245
|
+
return type_term
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
--------------------------------------------------------------------------
|
|
249
|
+
-- Insert a type-checking function call on [term] before returning
|
|
250
|
+
-- [term]'s value. Only legal in an expression context.
|
|
251
|
+
--------------------------------------------------------------------------
|
|
252
|
+
local non_const_tags = table.transpose
|
|
253
|
+
{ 'Dots', 'Op', 'Index', 'Call', 'Invoke', 'Table' }
|
|
254
|
+
function checktype_builder(type, term, kind)
|
|
255
|
+
-- Shove type-checking code into the term to check:
|
|
256
|
+
match kind with
|
|
257
|
+
| 'expr' if non_const_tags [term.tag] ->
|
|
258
|
+
local v = mlp.gensym()
|
|
259
|
+
return `Stat{ { `Local{ {v}, {term} }; `Call{ type, v } }, v }
|
|
260
|
+
| 'expr' ->
|
|
261
|
+
return `Stat{ { `Call{ type, term } }, term }
|
|
262
|
+
| 'stat' ->
|
|
263
|
+
return `Call{ type, term }
|
|
264
|
+
end
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
--------------------------------------------------------------------------
|
|
268
|
+
-- Parse the typechecking tests in a function definition, and adds the
|
|
269
|
+
-- corresponding tests at the beginning of the function's body.
|
|
270
|
+
--------------------------------------------------------------------------
|
|
271
|
+
local function func_val_builder (x)
|
|
272
|
+
local typed_params, ret_type, body = unpack(x)
|
|
273
|
+
local e = `Function{ { }, body; param_types = { }; ret_type = ret_type }
|
|
274
|
+
|
|
275
|
+
-- Build [untyped_params] list, and [e.param_types] dictionary.
|
|
276
|
+
for i, y in ipairs (typed_params) do
|
|
277
|
+
if y.tag=="Dots" then
|
|
278
|
+
assert(i==#typed_params, "`...' must be the last parameter")
|
|
279
|
+
break
|
|
280
|
+
end
|
|
281
|
+
local param, type = unpack(y)
|
|
282
|
+
e[1][i] = param
|
|
283
|
+
if type then e.param_types[param[1]] = type end
|
|
284
|
+
end
|
|
285
|
+
return e
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
--------------------------------------------------------------------------
|
|
289
|
+
-- Parse ":: type" annotation if next token is "::", or return false.
|
|
290
|
+
-- Called by function parameters parser
|
|
291
|
+
--------------------------------------------------------------------------
|
|
292
|
+
local opt_type = gg.onkeyword{ "::", mlp.expr }
|
|
293
|
+
|
|
294
|
+
--------------------------------------------------------------------------
|
|
295
|
+
-- Updated function definition parser, which accepts typed vars as
|
|
296
|
+
-- parameters.
|
|
297
|
+
--------------------------------------------------------------------------
|
|
298
|
+
|
|
299
|
+
-- Parameters parsing:
|
|
300
|
+
local id_or_dots = gg.multisequence{ { "...", builder = "Dots" }, default = mlp.id }
|
|
301
|
+
|
|
302
|
+
-- Function parsing:
|
|
303
|
+
mlp.func_val = gg.sequence{
|
|
304
|
+
"(", gg.list{
|
|
305
|
+
gg.sequence{ id_or_dots, opt_type }, terminators = ")", separators = "," },
|
|
306
|
+
")", opt_type, mlp.block, "end",
|
|
307
|
+
builder = func_val_builder }
|
|
308
|
+
|
|
309
|
+
mlp.lexer:add { "::", "newtype" }
|
|
310
|
+
mlp.chunk.transformers:add (chunk_transformer)
|
|
311
|
+
|
|
312
|
+
-- Local declarations parsing:
|
|
313
|
+
local local_decl_parser = mlp.stat:get "local" [2].default
|
|
314
|
+
|
|
315
|
+
local_decl_parser[1].primary = gg.sequence{ mlp.id, opt_type }
|
|
316
|
+
|
|
317
|
+
function local_decl_parser.builder(x)
|
|
318
|
+
local lhs, rhs = unpack(x)
|
|
319
|
+
local s, stypes = `Local{ { }, rhs or { } }, { }
|
|
320
|
+
for i = 1, #lhs do
|
|
321
|
+
local id, type = unpack(lhs[i])
|
|
322
|
+
s[1][i] = id
|
|
323
|
+
if type then stypes[id[1]]=type end
|
|
324
|
+
end
|
|
325
|
+
if next(stypes) then s.types = stypes end
|
|
326
|
+
return s
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
function newtype_builder(x)
|
|
330
|
+
local lhs, rhs = unpack(x)
|
|
331
|
+
match lhs with
|
|
332
|
+
| `Id{ x } -> t = process_type (rhs)
|
|
333
|
+
| `Call{ `Id{ x }, ... } ->
|
|
334
|
+
t = `Function{ { }, rhs }
|
|
335
|
+
for i = 2, #lhs do
|
|
336
|
+
if lhs[i].tag ~= "Id" then error "Invalid newtype parameter" end
|
|
337
|
+
t[1][i-1] = lhs[i]
|
|
338
|
+
end
|
|
339
|
+
| _ -> error "Invalid newtype definition"
|
|
340
|
+
end
|
|
341
|
+
return `Let{ { `Index{ `Id "types", `String{ x } } }, { t } }
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
mlp.stat:add{ "newtype", mlp.expr, "=", mlp.expr, builder = newtype_builder }
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
--------------------------------------------------------------------------
|
|
348
|
+
-- Register as an operator
|
|
349
|
+
--------------------------------------------------------------------------
|
|
350
|
+
--mlp.expr.infix:add{ "::", prec=100, builder = |a, _, b| insert_test(a,b) }
|
|
351
|
+
|
|
352
|
+
return +{ require (-{ `String{ package.metalua_extension_prefix .. 'types-runtime' } }) }
|