在Bucklescript中使用自定义命名(IE命名为运行时)属性的方法

时间:2017-07-17 10:49:49

标签: ffi bucklescript

所以,我正在尝试为游戏Screeps编程AI,其文档被发现here

我正在尝试在OCaml中编写我的AI,然后我通过 Bucklescript 编译到Javascript,其文档被找到here

在Screeps的API中的Anywho是方法Game.spawns.SPAWN_NAME.createCreep,其中SPAWN_NAME对应于所讨论的'spawn'对象的名称。它接收一个对应于'Creep'的各种身体部位的字符串数组,它有助于产生,并且给出正确的函数调用(具有足够的能量储备),你的Creep将在游戏中产生。

示例调用(在JS中)将是Game.spawns['Spawn1'].createCreep(["body","move"]);

我已经有代码,它给了我OCaml中所有产生的string array。该代码是:

let spawns : string array = [%bs.raw{|Object.keys(Game.spawns)|}]
let spawnsArray : string array = spawns

假设我有一个名为Spawn1的spawn,而且我在OCaml中也有一个字符串数组:

let spawnName : string = "Spawn1" 
let body : string array = [|"body","move|]

然后我使用如下所示的for循环遍历该数组中的每个字符串:

for i=0 to Array.length spawns - 1 do
  // I WANT TO CALL SOMETHING ANALOGOUS TO MY FUNCTION HERE
done

在我的生活中,我无法弄清楚如何格式化Bucklescript绑定,以便我可以使用createCreepbody : string array动态调用spawnName : string函数。任何帮助都会很棒。我知道Bucklescript文档中简要描述了bs.getbs.set方法,但我不知道如何使用它们。

提前感谢您的帮助。

编辑:

我设法通过在Javascript模块中编写自己的“接口”函数来“解决”这个问题,然后我可以通过bs.module Bucklescript绑定来调用它。

IE我写了一个函数

function spawnCreepHelper(spawnName, body) {
  Game.spawns[spawnName].createCreep(body);
}

然后我可以通过

打电话
external spawnCreepHelper : string -> string array -> unit = "" 
[@@bs.module "./supplemental", "Supplement"]

似乎有点被黑客攻击我,所以如果有人有另一种接近它的方式,不涉及自己重写他们的API,请告诉我。

1 个答案:

答案 0 :(得分:0)

您可能需要bs.get_index属性:

type spawn
type spawns
external spawns : spawns = "" [@@bs.val] [@@bs.scope "Game"]
external getSpawn : spawns -> string -> spawn = "" [@@bs.get_index]
external createCreep : spawn -> string array -> unit = "" [@@bs.send]

let _ =
  let spawn = getSpawn spawns "spawn1" in
  createCreep spawn [|"body"; "move"|]

编译到

var spawn = Game.spawns["spawn1"];

spawn.createCreep(/* array */[
      "body",
      "move"
    ]);

然后,您可以通过提供自己的Object.keys

外部类型来获取密钥
 external keys : spawns -> string array = "" [@@bs.val] [@@bs.scope "Object"]

 let _ =
   spawns |> keys
          |> Js.Array.forEach Js.log

将编译为

Object.keys(Game.spawns).forEach((function (prim) {
        console.log(prim);
        return /* () */0;
      }));   

或者,您可以将spawns键入spawn Js.Dict并使用BuckleScript提供的功能来访问和操作它:https://bucklescript.github.io/bucklescript/api/Js.Dict.html