2009-08-15 5 views
4

저는 현재 루아를 내가 작업하고있는 응용 프로그램 중 하나로 구현하고 있습니다. 현재 저는 C api를 사용하고 lua_register를 사용하여 함수를 등록하고 있습니다 만, 정적 및 비 정적 함수 포인터를 특정 클래스 메소드에 전달할 수 있기를 바랍니다.루아 스크립팅 구현

그물에 특정 라이브러리가 있지만 전체 기능이 거의 필요하지 않기 때문에 제공하기가 쉬운 방법이 있는지 궁금합니다.

감사합니다.

+0

lua_register의 문제점은 실제로 있습니까? 별표로 선언 된 함수의 가시성입니까? –

답변

4

복잡한 라이브러리 API는 종종 SWIG을 사용하여 신속하고 거의 (거의) 래핑 할 수 있습니다. 이 경우 SWIG를 사용하면 Lua, Perl, Python, Ruby 및 Java를 포함한 18 major languages에서 라이브러리를 사용할 수있는 SWIG 기반 래퍼를 쉽게 작성할 수 있다는 장점이 있습니다.

루아가 선호하는 (그리고 아마도 유일한) 관심사라면, 나는 luaL_register()을 전략의 핵심에 사용하여 C에서 루아 모듈을 만드는 방법을 배우는 것이 좋습니다. 이렇게 모듈을 만드는 이점은 오버 헤드없이 단일 이름 공간에서 모든 기능을 사용할 수 있습니다. Lua C 함수 호출 규칙 (정확히 lua_register()과 같이)과 일치하는 래퍼 함수를 ​​생성하고 스택에서 Lua 인수를 수집하여 래핑 된 함수를 호출하고 반환 값과 출력 매개 변수를 루아 스택. 이 문제를 해결하는 방법에 대한 좋은 개요는 Programming in Lua에서 찾을 수 있습니다. 초판의 온라인 카피는 Chapter 26에서 라이브러리 생성에 대해 논하고 있지만, Lua 5.0을 위해 쓰여졌다. 필자는 루아를 사용하여 PiL의 최신판을 소유하고있는 사람들에게 진지하게 강력히 권할 것입니다.

불행히도 Lua 5.1이 5.0과 가장 많이 다른 부분은 require으로 모듈 (C 및 Lua 모두)의 동적로드에 있습니다.

다음은 Lua 5.1에서 작동하는 C 라이브러리의 전체 예제 (작은 경우)입니다. 내보낼 필요가있는 유일한 기능은 이름이 require으로 사용되는 모듈의 이름과 일치해야합니다, luaopen_sm() 것을 특히

#include <lua.h> 
#include <luaxlib.h> 
#include <math.h> 
#undef PI 
#define PI (3.14159265358979323846) 

static int l_sin (lua_State *L) { 
    double r = luaL_checknumber(L,1); 
    lua_pushnumber(L, sin(r)); 
    return 1; 
} 

static int l_cos (lua_State *L) { 
    double r = luaL_checknumber(L,1); 
    lua_pushnumber(L, cos(r)); 
    return 1; 
} 

static const struct luaL_reg smlib [] = { 
    {"sin", l_sin}, 
    {"cos", l_cos}, 
    {NULL, NULL} /* sentinel */ 
}; 

int luaopen_sm (lua_State *L) { 
    luaL_openlib(L, "sm", smlib, 0); 
    lua_pushnumber(L,PI); 
    lua_rawset(L,-2,"pi"); 
    return 1; 
} 

참고 : 우리는 C 파일에서 래퍼의 구현 시작 , 그리고 DLL 파일의 이름. sm.dll라는 DLL로 컴파일 그 파일과 함께 다음로드 할 수 있습니다 (아마 유닉스 계열 시스템에 libsm.so 이름)이 같은 루아 스크립트에 사용 :

 
require "sm" 
print(sm.sin(sm.pi/3), sm.cos(sm.pi/3)); 

이 예를 들어, 테스트되지 않은 있지만, 컴파일해야하며, 운영. math.h에서 대부분의 함수를 래핑하는 완전한 예제는 Lua와 함께 배포되는 source to the math module을 참조하십시오. 이러한 씬 래퍼에는 반복적 인 코드가 많이 포함되어 있기 때문에 SWIG와 같은 도구는 각 함수의 선언 만 주어지면 종종 만들 수 있습니다.

C++ 클래스의 래핑 방법은 원칙적으로 유사합니다. 각각의 루아 - 호출 가능한 래퍼 함수는 C++ 측에서 this에 매핑 될 수있는 인수를 필요로 할 것이고, 모듈 - 정적 함수 또는 변환되는 대상 객체 인스턴스를 찾는 정적 멤버 함수로 구현되어야한다 다른 주장들. SWIG는 이런 종류의 래퍼를 만드는 데 특히 뛰어나며 그 길을 따라 많은 피투성이의 내용을 숨 깁니다.