سؤال

أيمكنك إعطاء التعليمات البرمجية المتكررة يوضح كيف يتم استخدام لوا جزءا لا يتجزأ في OCaml?

مثال بسيط يمكن أن يكون "مرحبا العالم" البديل.وقد OCaml مطالبة المستخدم اسم.ثم نقل هذا الاسم إلى لوا وظيفة.وقد لوا طباعة تحية العائد لطول الاسم.ثم يكون OCaml طباعة رسالة عن طول الاسم.

على سبيل المثال:

المستخدم@desktop:~$ ./مرحبا.تختار

اسم ؟ المستخدم

مرحبا المستخدم.

اسمك 4 رسائل طويلة.

المستخدم@desktop:~$

[عدل]

غير مبرمج C, هل يمكنني تنفيذ هذا دون الحاجة إلى كتابة وسيط برنامج C لتمرير البيانات بين لوا و OCaml?

التالي هو فكرة نظرية ما أود أن محاولة.للأسف خط 3 من ocaml_hello.مل سوف تحتاج إلى معرفة كيفية استدعاء الدالة المعرفة في lua_hello.لوا من أجل رمز على أن تكون سارية المفعول.

lua_hello.لوا ويعرف lua_hello الذي يطبع حجة وإرجاع طوله.

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

ocaml_hello.مل OCaml يطالب اسم يدعو لوا وظيفة, يطبع قيمة الإرجاع.

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;;
هل كانت مفيدة؟

المحلول

أنا لست على بينة من مجموعة ناضجة من الارتباطات إلى ترسيخ C تنفيذ لوا في OCaml.غير ناضجة مجموعة من الارتباطات كان نشر على Caml القائمة البريدية في عام 2004.

إذا كنت ترغب في استخدام مل تنفيذ يمكنك أن تجد بعض الأمثلة في ورقة تسمى مل وحدة هوس.فإن مل التنفيذ ، على عكس C تنفيذ ضمانات سلامة نوع, ولكن للقيام بذلك يستخدم بعض جدا وضيع الحيل في مل وحدة النظام.إذا كنت تسأل الأسئلة الأساسية ، ربما كنت ترغب في تجنب هذا.

في المثال الخاص بك هو قليلا من الصعب تخمين حيث تريد وظيفة تأتي من.أقترح عليك إما طلب C مثلا أو إعطاء الناس C سبيل المثال ونسأل كيف يمكن أن تتحقق في OCaml (على الرغم من أنني أعتقد الارتباطات ستكون مشكلة).


تحرير

ردا على المنقحة السؤال أنها معقدة جدا.النموذج المعتاد هو أن عليك أن تضع لوا في تهمة ، تسمونه الهدف Caml رمز من Lua.أنت تضع 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 وحدات.

نصائح أخرى

على مزيد من التفكير, أنا لست متأكدا مما إذا كان يمكنك أن تفعل هذا مع مسؤول C تنفيذ لوا ، لأنني أعتقد OCaml يعتقد أنه يملك main().سيكون لديك لمعرفة ما إذا كان OCaml يمكن أن تعبأ مكتبة من ج البرنامج الرئيسي.

على سبيل المثال وضع لوا-مل المسؤول ، يمكنك الحصول على لوا-مل مستقل من Cminusminus.org و يمكنك أيضا التحقق من الأمثلة في ورقة حول لوا-مل فضلا عن كود المصدر كيبيك-- مترجم نفسها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top