[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: syntactic sugar for imports and exports
- From: Xavier Wang <weasley.wx@...>
- Date: Fri, 21 Oct 2011 14:17:55 +0800
I love this idea!
2011/10/20 Tony Finch <dot@dotat.at>:
> Further thoughts on the use+mention problem, where we have to repeat a
> name to use it as a variable and to mention it as a table index or
> function argument. The main examples are:
>
> local name = name -- keep name in scope after altering _ENV
> local name = module.name -- import unqualified name from module
> local name = require "name" -- module linkage
> { name = name } -- export variable into table
>
> The usual proposal to improve the first two is as follows, but I'm trying
> to find a more general solution.
>
> local name in _ENV
> local name in module
>
> I call the first three "projection" from a table or function into
> variables and the last one "injection" from variables into a table.
>
> It seems to be helpful to think of both projection and injection as
> special kinds of assignment. This emphasizes their duality, and it
> suggests a better syntax for injection.
>
> So the syntax for projection might be like
>
> foo, bar, zig <- tbl
>
> where "foo, bar, zig" is a list of variable names and "tbl" is an
> expresion. The "<-" is pronounced "from" as in "assigned from" or
> "imported from". This is equivalent to
>
> foo, bar, zig = tbl.foo, tbl.bar, tbl.zig
>
> except that tbl is evaluated once. A projection statement starting with
> "local" has the obvious translation:
>
> local foo, bar, zig <- tbl
> local foo, bar, zig = tbl.foo, tbl.bar, tbl.zig
>
> Injection might be like
>
> tbl -< foo, bar, zig
>
> which is equivalent to
>
> tbl.foo, tbl.bar, tbl.zig = foo, bar, zig
>
> with the same conditions as before. Injection needs a different operator
> so you can tell the difference between "x <- y" and "y -< x". The "-<"
> symbol is the syringe operator.
>
> I think on balance it doesn't make sense to support projecting from
> functions directly. This avoids muddling the concepts of indexing and
> calling, but you can still use the __index metamethod if you want. For
> example,
>
> -- syntactic sugar for require
>
> library = setmetatable(package.loaded, {
> __index = function (_, name)
> return require(name)
> end
> })
>
> -- get math and io modules from the library
>
> local math, io <- library
>
> Tony.
> --
> f.anthony.n.finch <dot@dotat.at> http://dotat.at/
> Dover, Wight, Portland, Plymouth: Northwest 4 or 5, increasing 6 at times,
> backing west 3 later. Slight or moderate, occasionally rough in Plymouth at
> first. Showers. Good.
>
>
- References:
- modules, require, magic, Eduardo Ochs
- Re: modules, require, magic, Javier Guerra Giraldez
- Re: modules, require, magic, Petite Abeille
- Re: modules, require, magic, Sam Roberts
- Re: modules, require, magic, David Manura
- Re: modules, require, magic, Hisham
- Re: modules, require, magic, Tony Finch
- Re: modules, require, magic, Hisham
- Re: modules, require, magic, Tony Finch
- syntactic sugar for imports and exports, Tony Finch