1

私は独自のパッケージ マネージャーを作成し始めており、依存関係システムの開発を開始しています。ビルドファイルは lua で書かれており、次のようになっています。

package = {
  name = "pfetch",
  version = "0.6.0",
  source = "https://github.com/dylanaraps/pfetch/archive/0.6.0.tar.gz",
  git = false
}

dependencies = {
   "some_dep",
   "some_dep2"
}

function install()
  quantum_install("pfetch", false)
end

唯一の問題、変換方法がわかりません

dependencies = {
   "some_dep",
   "some_dep2"
}

グローバルな C++ 配列へ:["some_dep", "some_dep2"] リスト内の文字列として有効でないものはすべて無視する必要があります。これを行う良い方法はありますか?前もって感謝します

: C api を使用して、C++ で lua とやり取りしています。Lua のエラーが C++ の例外を使用するのか、C++ の例外を使用するのかはわかりませんlongjmp

4

1 に答える 1

1

あなたのコメントの説明に基づいて、次のようなものがうまくいきます:

#include <iostream>
#include <string>
#include <vector>
#include <lua5.3/lua.hpp>

std::vector<std::string> dependencies;

static int q64795651_set_dependencies(lua_State *L) {
    dependencies.clear();
    lua_settop(L, 1);
    for(lua_Integer i = 1; lua_geti(L, 1, i) != LUA_TNIL; ++i) {
        size_t len;
        const char *str = lua_tolstring(L, 2, &len);
        if(str) {
            dependencies.push_back(std::string{str, len});
        }
        lua_settop(L, 1);
    }
    return 0;
}

static int q64795651_print_dependencies(lua_State *) {
    for(const auto &dep : dependencies) {
        std::cout << dep << std::endl;
    }
    return 0;
}

static const luaL_Reg q64795651lib[] = {
    {"set_dependencies", q64795651_set_dependencies},
    {"print_dependencies", q64795651_print_dependencies},
    {nullptr, nullptr}
};

extern "C"
int luaopen_q64795651(lua_State *L) {
    luaL_newlib(L, q64795651lib);
    return 1;
}

デモ:

$ g++ -fPIC -shared q64795651.cpp -o q64795651.so
$ lua5.3
Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio
> q64795651 = require('q64795651')
> dependencies = {
>>    "some_dep",
>>    "some_dep2"
>> }
> q64795651.set_dependencies(dependencies)
> q64795651.print_dependencies()
some_dep
some_dep2
>

1 つの重要な落とし穴: Lua が使用するためにコンパイルされているかどうか、longjmpまたはそのエラーの例外があるかどうかわからないため、Lua エラーが発生する可能性のある場所にデストラクタを持つ自動変数がないことを確認する必要があります。(これは私の回答のコードにすでに当てはまります。これをプログラムに組み込むときに、誤ってそのような場所を追加しないようにしてください。)

于 2020-11-12T22:34:21.267 に答える