3

我想在 OCaml 中翻译以下 Javascript 示例程序,使用js_of_ocaml

var AWS = require('aws-sdk');
AWS.config.region = 'us-west-2';
var s3 = new AWS.S3();
s3.listBuckets(function(err, data) {
  if (err) { console.log("Error:", err); }
  else {
    for (var index in data.Buckets) {
      var bucket = data.Buckets[index];
      console.log("Bucket: ", bucket.Name, ' : ', bucket.CreationDate);
    }
  }
});

我写了以下 OCaml 片段

let require_module s =
    Js.Unsafe.fun_call
      (Js.Unsafe.js_expr "require")
      [|Js.Unsafe.inject (Js.string s)|]

module AWS : sig
  type error

  class type s3 = object
    method listBuckets :
      (error -> Js.Unsafe.any -> unit) Js.callback -> unit Js.meth
  end

  val s3client : unit -> s3
end = struct
  let _js_aws = require_module "aws-sdk"

  type error =
    Js.Unsafe.any

  class type s3 = object
    method listBuckets :
      (error -> Js.Unsafe.any -> unit) Js.callback -> unit Js.meth
  end

  let s3client () =
    let constr_s3 = _js_aws ## S3 in
    new%js constr_s3 ()
end

但是当我编译它时

ocamlfind ocamlc -c -package "js_of_ocaml js_of_ocaml.syntax" -o example_s3.cmo example_s3.ml

它与

Error: '##' is not a valid value identifier.

如何修复我的程序或编译命令来解决这个问题?

4

1 回答 1

4

如果您想使用该软件包js_of_ocaml.syntax,您必须将-syntax camlp4o选项添加到 ocamlfind。

但是您应该使用新的 ppx 语法而不是旧的camlp4 语法(您似乎知道,因为您使用new%js)。为此,您需要js_of_ocaml.syntax用 ppx 语法的包替换。

于 2016-01-18T12:17:07.590 回答