Commits

Dmitry Grebeniuk committed 33f59a6

init

Comments (0)

Files changed (6)

+^_build/
+^log$
+^dyntest.exe$
+call c:\ocaml\set-vars.bat
+set NAT=native
+del dyntest.exe dyntest.%NAT%
+ocamlbuild dyntest.%NAT% > log 2>&1 && copy dyntest.%NAT% dyntest.exe && del dyntest.%NAT%
+cd _build
+ocamlc -pp camlp4r -w A -c -i dynvar.ml
+ocamlc -pp camlp4r -w A -c -i dyntest.ml
+<dyn*.ml*> : camlp4r
+<*.ml*> : w_A
+open Dynvar
+;
+
+value tyint = mktype "int"
+;
+
+value tystring = mktype "string"
+;
+
+value v1 = var tyint 123
+  and v2 = var tystring "kva"
+;
+
+value vlist = [v1; v2]
+;
+
+value () =
+  Printf.printf "v1 = %i, v2 = %s\n"
+    (get tyint v1) (get tystring v2)
+;
+
+value tycatch f x =
+  try f x
+  with
+  [ Type_error (type_value, type_usedwith) ->
+      Printf.eprintf "value has type %S but used with type %S\n"
+      type_value type_usedwith
+  ]
+;
+
+value () =
+tycatch
+  (fun () ->
+     Printf.printf "int as string = %s\n" (get tystring v1)
+  )
+  ()
+;
+
+value () =
+tycatch
+  (fun () ->
+     Printf.printf "string as int = %i\n" (get tyint v2)
+  )
+  ()
+;
+(** Type_error (value_type, used_with_type) *)
+exception Type_error of (string * string)
+;
+
+type ty 'a = (string * ref (option 'a))
+ and var = (Obj.t * Obj.t)   (* (ty_repr, val_repr) *)
+;
+
+value mktype name = (name, ref None)
+;
+
+value var ty x =
+  (Obj.repr ty, Obj.repr x)
+;
+
+value name_of_ty_repr ty =
+  ((Obj.obj (Obj.field ty 0)) : string)
+;
+
+value get ((ty_name, ty_ref) as ty) (x_ty_repr, x_val_repr) =
+  if (Obj.repr ty) != x_ty_repr
+  then
+    raise (Type_error ((name_of_ty_repr x_ty_repr), ty_name))
+  else
+    let v = Obj.obj x_val_repr in
+    ( if 1<>1 then ty_ref.val := v else ()
+    ; v
+    )
+;
+exception Type_error of (string * string)
+;
+
+type ty 'a;
+type var;
+
+value mktype : string -> ty 'a
+;
+
+value var : ty 'a -> 'a -> var
+;
+
+value get : ty 'a -> var -> 'a
+;
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.