문제

OCAML에 내장 된 LUA를 사용하는 방법을 보여주는 코드 스 니펫을 주시겠습니까?

간단한 예는 "Hello, World"변형 일 수 있습니다. OCAML이 사용자에게 이름을 제출하도록하십시오. 그런 다음 해당 이름을 LUA 기능으로 전달하십시오. Lua에게 인사말을 인쇄하고 이름의 길이를 반환하도록하십시오. 그런 다음 OCAML에 이름의 길이에 대한 메시지를 인쇄하도록하십시오.

예시:

사용자@데스크탑 : ~ $ ./Hello.opt

이름? 사용자

안녕하세요, 사용자.

당신의 이름은 4 글자 길이입니다.

사용자@데스크탑 : ~ $

편집하다

비 C 프로그래머로서 LUA와 OCAML 사이의 데이터를 전달하기 위해 중개 C 프로그램을 작성하지 않고도이를 구현할 수 있습니까?

다음은 내가 시도하고 싶은 것에 대한 이론적 아이디어입니다. 불행히도, OCAML_HELLO.ML의 3 행은 코드가 유효하기 위해서는 lua_hello.lua에 정의 된 함수를 호출하는 방법을 알아야합니다.

lua_hello.luaLUA_HELLO를 정의하는데, 이는 논쟁을 인쇄하고 길이를 반환합니다.

1  function lua_hello (name)
2    print ("Hello, "..name..".")
3    return (string.len (name))
4  end

OCAML_HELLO.MLOCAML은 이름을 프롬프트하고 LUA 기능을 호출하며 리턴 값을 인쇄합니다.

1  let () = print_string "Name? "; flush stdout in
2  let name = input_line stdin in
3  let len  = Lua_hello.lua_hello name in
4    Printf.printf "Your name is %d letters long." len; flush stdout;;
도움이 되었습니까?

해결책

나는 LUA의 C 구현을 OCAML에 포함시키기위한 성숙한 바인딩 세트를 알지 못한다. 미성숙 한 바인딩 세트 2004 년 CAML 메일 링리스트에 게시되었습니다.

ML 구현을 사용하려면 ML 모듈 매니아. ML 구현은 C 구현과 달리 유형 안전을 보장하지만 그렇게하려면 ML 모듈 시스템에서 매우 끔찍한 트릭을 사용합니다. 기본적인 질문을한다면 아마도 이것을 피하고 싶을 것입니다.

당신의 예에서는 기능이 어디에서 왔는지 추측하기가 조금 어렵습니다. 나는 당신이 C 예제를 요청하거나 사람들에게 C 예제를주고 OCAML에서 어떻게 실현 될 수 있는지 물어 보는 것이 좋습니다 (구속력이 문제가 될 것이라고 생각하지만).


편집하다

수정 된 질문에 대한 응답으로 매우 복잡합니다. 일반적인 모델은 LUA를 담당하고 LUA에서 목표 CAML 코드를 호출한다는 것입니다. 당신은 CAML을 담당하는 것을 더 복잡하게 만듭니다. 다음은 어떻게 보이는지에 대한 대략적인 스케치입니다.

let lua = Lua.new()  (* create Lua interpreter *)
let chunk = LuaL.loadfile lua "hello.lua" (* load and compile the file hello.lua *)
let _ = Lua.call lua 0 0 (* run the code to create the hello function *)
let lua_len s =
  (* push the function; push the arg; call; grab the result; pop it; return *)
  let _ = Lua.getglobal lua "lua_hello" in
  let _ = Lua.pushstring lua s in
  let _ = Lua.call lua 1 1 in
  let len = Lua.tointeger lua (-1) in
  let _ = Lua.pop lua 1 in
  len

let () = print_string "Name? "; flush stdout
let name = input_line stdin
let len  = lua_len name
Printf.printf "Your name is %d letters long." len; flush stdout;;

다시, 나는 당신이 어디에서 바인딩을 얻을 수 있는지 모른다. Lua 그리고 LuaL 모듈.

다른 팁

추가 반성에서, 나는 당신이 LUA의 공식 C 구현으로 이것을 할 수 있는지 확실하지 않습니다. main(). OCAML이 C 메인 프로그램에서 라이브러리로 포장 될 수 있는지 알아야합니다.

LUA-ML을 담당하는 예를 들어 LUA-ML 독립형 cminusminus.org에서 LUA-ML에 대한 종이 뿐만 아니라 소스 코드 QC-- 컴파일러 그 자체.

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