Использование метода для пользовательского имени (IE named at runtime) в Bucklescript
Итак, я пытаюсь запрограммировать AI для игры Screeps, чьи документы найдены здесь.
Я пытаюсь написать свой AI в OCaml, который затем компилирую в Javascript через Bucklescript, документы которого находятся здесь.
Anywho, в API Screeps API - это метод Game.spawns.SPAWN_NAME.createCreep
, в котором SPAWN_NAME
соответствует названию объекта "spawn". Он принимает строковый массив, соответствующий различным частям тела "Creep", который помогает порождать, и при правильном вызове функции (с достаточным запасом энергии) ваш Creep будет появляться в игре.
Пример вызова (в JS) будет Game.spawns['Spawn1'].createCreep(["body","move"]);
У меня уже есть код, который дает мне string array
всех икр в OCaml. Этот код:
let spawns : string array = [%bs.raw{|Object.keys(Game.spawns)|}]
let spawnsArray : string array = spawns
Предположим, что у меня есть одна икра, названная Spawn1
, и что у меня также есть строковый массив для композиции тела в 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, чтобы я мог динамически вызывать функцию createCreep
с помощью body: string array
и spawnName: string
. Любая помощь будет потрясающей. Я знаю, что bs.get
и bs.set
кратко описаны в документах Bucklescript, но я не знаю, как их использовать.
Заранее спасибо за помощь.
РЕДАКТИРОВАТЬ:
Мне удалось " bs.module
проблему", написав собственные функции "сопряжения" в модуле 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 сам, пожалуйста, дайте мне знать.
Вероятно, вам нужен атрибут 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
свой собственный внешний 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