Frage

Ich bin ein sehr Anfänger OCaml Programmierer also bitte verzeiht mir, wenn dies eine dumme / offensichtliche Frage ist. Es gibt viel zu absorbieren, und ich habe dies in der Dokumentation verpasst kann.

Ich habe eine Basis von Code, der wie folgt aussehen fängt:

let update_x p x =
  add_delta p;
  p.x <- x;
  refresh p

let update_y p y =
  add_delta p;
  p.y <- y;
  refresh p

let update_z p z =
  add_delta p;
  p.z <- z;
  refresh p 

Die Vervielfältigung auf Bug beginnt mich, weil ich wollen , so etwas schreiben:

let update_scalar p scalar value =
    add_delta p;
    magic_reflection (p, scalar) <- value;
    refresh p

Auf diese Weise, wenn ich x aktualisiere ich einfach anrufen:

update_scalar p 'x' value

Dies ruft „Makros“ zu mir, aber ich glaube nicht, OCaml ein Makro-System. Was kann ich sonst noch tun?

War es hilfreich?

Lösung

Nein, Sie können nicht tun, was Sie im Klar OCaml wollen. Sie könnten eine Syntaxerweiterung schreiben mit camlp4 (die eine Art ist von ein Makro-System, obwohl eine andere Art, als Sie wahrscheinlich gewöhnt sind), die würde verwandeln

UPDATE_FIELD x f y

in

x.f <- y

Alternativ können Sie auch die Dinge in eine Hash-Tabelle stopfen könnten und Typsicherheit verzichten.

Hinweis: Die Version von camlp4 in OCaml Version 3.10 und höher enthalten ist anders als und unvereinbar mit der vorherige Version. finden Sie Informationen über die neueste Version, der OCaml Tutorial-Website .

Andere Tipps

Sie können nicht ganz das tun, was Sie wollen, aber Sie können den Textvorschlag mit einer Funktion höherer Ordnung erheblich reduzieren:

let update_gen set p x =
  add_delta p;
  set p x;
  refresh p

let update_x = update_gen (fun p v -> p.x <- v)
let update_y = update_gen (fun p v -> p.y <- v)
let update_z = update_gen (fun p v -> p.z <- v)

OCaml hat ein Makrosystem (camlp4) und es ermöglicht es Ihnen, diese Art der Sache zu implementieren, mit etwas Arbeit.

Wie oben ocaml bemerkt hat Makrosystem. Und für diese Aufgabe nur kleiner Bruchteil davon ist erforderlich:

open Printf

type t = { mutable x : float; mutable y : float; mutable z : float; mutable t : int; }

let add_delta p = p.t <- p.t + 1
let refresh p = printf "%d) %.2f %.2f %.2f\n" p.t p.x p.y p.z

DEFINE UPD(x) = fun p v ->
  add_delta p;
  p.x <- v;
  refresh p

let update_x = UPD(x)
let update_y = UPD(y)
let update_z = UPD(z)

let () =
  let p = { x = 0.; y = 0.; z = 0.; t = 0; } in
  update_x p 0.1;
  update_y p 0.3;
  update_z p 2.0

Kompilieren mit:

ocamlfind ocamlc -package camlp4.macro -syntax camlp4o q.ml -o q

Sehen Sie den erzeugten Code mit:

camlp4o Camlp4MacroParser.cmo q.ml
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top