Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
17
Task/Currying/Lua/currying-1.lua
Normal file
17
Task/Currying/Lua/currying-1.lua
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
function curry2(f)
|
||||
return function(x)
|
||||
return function(y)
|
||||
return f(x,y)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function add(x,y)
|
||||
return x+y
|
||||
end
|
||||
|
||||
local adder = curry2(add)
|
||||
assert(adder(3)(4) == 3+4)
|
||||
local add2 = adder(2)
|
||||
assert(add2(3) == 2+3)
|
||||
assert(add2(5) == 2+5)
|
||||
35
Task/Currying/Lua/currying-2.lua
Normal file
35
Task/Currying/Lua/currying-2.lua
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
local curry do
|
||||
local call,env = function(fn,...)return fn(...)end
|
||||
local fmt,cat,rawset,rawget,floor = string.format,table.concat,rawset,rawget,math.floor
|
||||
local curryHelper = setmetatable({},{
|
||||
__call = function(me, n, m, ...)return me[n*256+m](...)end,
|
||||
__index = function(me,k)
|
||||
local n,m = floor(k / 256), k % 256
|
||||
local r,s = {},{} for i=1,m do r[i],s[i]='_'..i,'_'..i end s[1+#s]='...'
|
||||
r,s=cat(r,','),cat(s,',')
|
||||
s = n<m and fmt('CALL(%s)',r) or fmt('function(...)return ME(%d,%d+select("#",...),%s)end',n,m,s)
|
||||
local sc = fmt('local %s=... return %s',r,s)
|
||||
rawset(me,k,(loadstring or load)(sc,'_',nil,env) )
|
||||
return rawget(me,k)
|
||||
end})
|
||||
env = {CALL=call,ME=curryHelper,select=select}
|
||||
function curry(...)
|
||||
local pn,n,fn = select('#',...),...
|
||||
if pn==1 then n,fn = debug.getinfo(n, 'u'),n ; n = n and n.nparams end
|
||||
if type(n)~='number' or n~=floor(n)then return nil,'invalid curry'
|
||||
elseif n<=0 then return fn -- edge case
|
||||
else return curryHelper(n,1,fn)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- test
|
||||
function add(x,y)
|
||||
return x+y
|
||||
end
|
||||
|
||||
local adder = curry(add) -- get params count from debug.getinfo
|
||||
assert(adder(3)(4) == 3+4)
|
||||
local add2 = adder(2)
|
||||
assert(add2(3) == 2+3)
|
||||
assert(add2(5) == 2+5)
|
||||
Loading…
Add table
Add a link
Reference in a new issue