Comments (8)
If there is a case to be made for this in a general purpose utility library and a way to do it robustly across Lua implementations then please feel free to still comment.
But, I think I'm in agreement with Thijs here, this is such a niche need and so brittle across platforms that I think we'd do more people a disservice by adding such a tool than we would help.
from penlight.
What s the use case voor something like this?
from penlight.
If there's an existing function that you want to patch and use the same name. It might be considered bad practice though. Say a library provides a function that does something to a string, call it, xlib.changestring(s)
. I might want to do something like this so that it works on a table as well:
local _changestring = pl.clone_function(xlib.changestring)
function xlib.changestring(s_or_t)
if type(s) == 'string' then
return _changestring(s_or_t)
elseif type(s) == 'table' then
return pl.tablex.map(_changestring, s_or_t)
end
end
from penlight.
@kalekje What would the clone_function()
actually be accomplishing here? The example code you gave will work just fine if you leave it out. Is this just about making that workflow safe for multi-thread usage? If so can we have an MWE that actually shows the problematic use case and proposed solution?
from penlight.
There would be a stack overflow problem otherwise, try the following:
function f(x) return x end
function f(x) return 2*f(x) end
print(f(1))
from penlight.
Okay I see it now.. I thought this would not work.
function f(x) return x end
f_temp = f
function f(x) return 2*f_temp(x) end
print(f(1))
from penlight.
This is severe hackery, see also the limitations over different Lua versions in Leafo's article.
My 2cts; if you need to do it, do it in your application. But this seems like bad practice in general and I see no place for that in a general utility lib. Using Penlight should be easy and safe imo.
from penlight.
@kalekje There are some things at play here;
-
in Lua all functions are anonymous. Except that defining functions by name has syntactic sugar to define the name before the function.
local function f(x) return 2*f(x) end
is equivalent to
local f f = function(x) return 2*f(x) end
Note that local
f
is now available inside the function, which is different from:local f = function(x) return 2*f(x) end
In which case it is NOT defined, because Lua will first evaluate the right hand side, and only then assign the values
-
using tail calls does not consume stack space, since the tail call will replace the last entry with the new one, instead of adding to the stack.
from penlight.
Related Issues (20)
- Cleanup: drop or improve pl.url HOT 4
- Consider adding the built-in table methods to tablex? HOT 3
- How about adding json decode and encode function HOT 4
- Error in pretty.write: invalid order function for sorting
- Bareword `warn` in compat.lua is a "strict" violation
- pl.Path.isdir Doesn't work correctly for Windows Base directory i.e. D:\\ (Lua 5.4.4) HOT 1
- Test suite failing on Arch Linux HOT 2
- lfs HOT 1
- stringx indent and dedent functions add an extra "\n" at the end of the string HOT 3
- lexer.cpp doesn't recognize #define without trailing newline HOT 2
- Can't use % as escape character in a template HOT 3
- Running the class's base function HOT 5
- Incorrect integer detection
- Consider implementing `cp` / `mv` via FFI HOT 2
- unexpected behavior for dir.clonetree HOT 1
- The `newline` option in the template module does not behave according to documentation HOT 4
- Fix link on luarocks HOT 3
- penlight 1.14 is rockspec_revision 1, but uses rockspec_revision 3 feature issues_url this breaks on luarocks-5.1 since it does not support rockspec 3 HOT 3
- Why "No error" in `compat.execute` HOT 7
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from penlight.