문제

최근에, 이 볼드윈 글을 쓰는 방법을 보여주었습니다 일반적이고 가변적 인 인수 memoize 함수. 하나의 매개 변수 만 필요한 경우 더 간단한 기능을 반환하는 것이 더 낫다고 생각했습니다. 내 총 가짜 시도는 다음과 같습니다.

local function memoize(f)
   local cache = {}

   if select('#', ...) == 1 then
      return function (x)
                if cache[x] then
                   return cache[x]
                else
                   local y = f(x)
                   cache[x] = y
                   return y
                end
              end
   else
      return function (...)
                local al = varg_tostring(...)
                if cache[al] then
                   return cache[al]
                else
                   local y = f(...)
                   cache[al] = y
                   return y
                end
             end
   end
end

확실히, select('#', ...) 이 맥락에서 실패하고 어쨌든 내가 원하는 것을 실제로하지 않을 것입니다. 내부에 말할 방법이 있습니까? 메모에 얼마나 많은 주장 에프 기대?


"아니오"는 확실히 알고 있다면 훌륭한 대답입니다. 두 개의 별도를 사용하는 것은 큰 문제가 아닙니다. 메모에 기능.

도움이 되었습니까?

해결책

디버그 정보로 가서 소스 코드에서 이것을 결정할 수 있지만 기본적으로 "아니오"입니다. 죄송합니다.

다른 팁

예, LUA 함수의 경우 C 함수는 아닙니다. 약간의 고문과 약간 스케치입니다.

debug.getlocal 호출 된 함수에서 작동하여 해당 기능을 호출해야합니다. 힌트를 보여주지 않습니다 ... 호출이 충분한 매개 변수를 전달하지 않는 한. 아래 코드는 20 개의 매개 변수를 시도합니다.

debug.sethook "호출"이벤트를 사용하면 기능이 코드를 실행하기 전에 기능을 가로 채울 수 있습니다.

이 알고리즘은 LUA 5.2에서 작동합니다. 이전 버전은 비슷하지만 동일하지는 않습니다.

assert(_VERSION=="Lua 5.2", "Must be compatible with Lua 5.2")

약간의 도우미 반복자 (효율성을 위해 감소 될 수 있음) :

local function getlocals(l)
  local i = 0
  local direction = 1
  return function ()
    i = i + direction
    local k,v = debug.getlocal(l,i)
    if (direction == 1 and (k == nil or k.sub(k,1,1) == '(')) then 
      i = -1 
      direction = -1 
      k,v = debug.getlocal(l,i) 
    end
    return k,v
  end
end

서명을 반환합니다 (그러나 대신 매개 변수 카운트 및 usevarargs를 반환 할 수 있습니다) :

local function dumpsig(f)
  assert(type(f) == 'function', 
    "bad argument #1 to 'dumpsig' (function expected)")
  local p = {}
  pcall (function() 
    local oldhook
    local hook = function(event, line)
      for k,v in getlocals(3) do 
        if k == "(*vararg)" then 
          table.insert(p,"...") 
          break
        end 
        table.insert(p,k) end
      debug.sethook(oldhook)
      error('aborting the call')
    end
    oldhook = debug.sethook(hook, "c")
    -- To test for vararg must pass a least one vararg parameter
    f(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
  end)
  return "function("..table.concat(p,",")..")"  
end

나는 당신이 루아에서 그렇게 할 수 없다고 확신합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top