Использование метода для пользовательского имени (IE named at runtime) в Bucklescript

84
12

Итак, я пытаюсь запрограммировать 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 сам, пожалуйста, дайте мне знать.

спросил(а) 2017-07-17T13:49:00+03:00 3 года, 4 месяца назад
1
Решение
110

Вероятно, вам нужен атрибут 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

ответил(а) 2017-07-27T21:27:00+03:00 3 года, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема