c - duty - कस्टम डिपार्टमेंट



एक कस्टम जोड़ी के साथ सी में एक लावा तालिका को दोहराएं (1)

मैं ऑर्डर्ड टेबल का उपयोग करना चाहता हूं सरल उदाहरण, मुझे लवा-विकी साइट पर मिला यहाँ लिंक है

लुआ में यह इस के साथ ठीक चलती है:

for i,v in t:opairs() do
   print( i,v )
end

इसके बजाय लुआ में चलना, मैं एक सी पद्धति को पास करना चाहता हूं और वहां मेज को फिर से करना चाहता हूं। सी एपीआई में मैं मूल pairs इटरेटर के लिए केवल lua_next पाया। मैं सी में इस लवा कोड को पुनरावृति कैसे कर सकता हूं?


आप क्या कर सकते हैं एक कस्टम next सी फ़ंक्शन lua_next जो lua_next नकल करता है, लेकिन opairs पद्धति के बजाय उस क्रमबद्ध तालिका पर काम करता है।

int luaL_orderednext(luaState *L)
{
  luaL_checkany(L, -1);                 // previous key
  luaL_checktype(L, -2, LUA_TTABLE);    // self
  luaL_checktype(L, -3, LUA_TFUNCTION); // iterator
  lua_pop(L, 1);                        // pop the key since 
                                        // opair doesn't use it

  // iter(self)
  lua_pushvalue(L, -2);
  lua_pushvalue(L, -2);
  lua_call(L, 1, 2);

  if(lua_isnil(L, -2))
  {
    lua_pop(L, 2);
    return 0;
  }
  return 2;
}

आप इसे सी में उपयोग कर सकते हैं lua_next समान:

int orderedtraverse(luaState *L)
{
  lua_settop(L, 1);
  luaL_checktype(L, 1, LUA_TTABLE);

  // t:opairs()
  lua_getfield(L, 1, "opairs");
  lua_pushvalue(L, -2);
  lua_call(L, 1, 2);

  // iter, self (t), nil
  for(lua_pushnil(L); luaL_orderednext(L); lua_pop(L, 1))
  {
    printf("%s - %s\n", 
           lua_typename(L, lua_type(L, -2)), 
           lua_typename(L, lua_type(L, -1)));
  }
  return 0;
}

ध्यान दें, मैंने इसका परीक्षण नहीं किया लेकिन यह काम करना चाहिए





iterator