Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[Caml-list] mixing dynlink & toplevel...

15 views
Skip to first unread message

Jonathan Roewen

unread,
Aug 26, 2006, 7:51:22 PM8/26/06
to Caml Mailing List
Hi,

I dunno if this is possible, but: if I use Dynlink, can I later load
toplevellib.cma, and use it like normal? At the moment I get undefined
reference to global 'Toploop'.

Jonathan

_______________________________________________
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs

Jonathan Roewen

unread,
Aug 27, 2006, 5:11:32 PM8/27/06
to Caml Mailing List
> Hi,
>
> I dunno if this is possible, but: if I use Dynlink, can I later load
> toplevellib.cma, and use it like normal? At the moment I get undefined
> reference to global 'Toploop'.
>
> Jonathan

I've just made a small test case to demonstate:

test.ml:
open Dynlink

let () = try
print_endline "init";
Dynlink.init ();
print_endline "allowing unsafe modules";
Dynlink.allow_unsafe_modules true;
print_endline "loading toplevellib.cma";
Dynlink.loadfile "/usr/local/lib/ocaml/toplevellib.cma";
print_endline "loading topstart.cmo";
Dynlink.loadfile "/usr/local/lib/ocaml/topstart.cmo";
(* now the ocaml toplevel should be running *)
with Dynlink.Error error -> print_endline (Dynlink.error_message error);;

To compile: ocamlc -o test -linkall dynlink.cma test.ml

Running:
colinux:~/test# ./test
init
allowing unsafe modules
loading toplevellib.cma
loading topstart.cmo (shouldn't return)
Objective Caml version 3.09.2

# let s = "hello world";;
Reference to undefined global `Toploop'
# exit 0;;
colinu:~/test#

As you can see, it can run functions fine (e.g. calling
Pervasives.exit), but let bindings fail.

I know that a module loaded via Dynlink.loadfile can call functions
defined by other modules loaded by Dynlink.loadfile before it (I
actually do this), so why can't the toplevel access these? It can only
access those of the original program from my testing.

Jonathan Roewen

unread,
Aug 27, 2006, 9:35:01 PM8/27/06
to Caml Mailing List
Well, I've solved my own problem. Mind you, I am known for doing
things that are not expected/thought of...

Turns out it was a double initialisation problem as dynlink &
toplevellib share some modules.

Vu Ngoc San

unread,
Aug 28, 2006, 5:49:00 AM8/28/06
to Jonathan Roewen
By the way, is there somewhere a doc for toplevellib ? It is not in the
"official" ocaml manual, and, googgleing a little bit, I could not find
anything.

Best
San

Jonathan Roewen a écrit :

Jonathan Roewen

unread,
Aug 28, 2006, 5:53:25 AM8/28/06
to Vu Ngoc San
> By the way, is there somewhere a doc for toplevellib ? It is not in the
> "official" ocaml manual, and, googgleing a little bit, I could not find
> anything.

None that I know of. An ocaml distribution puts a couple of the .cmi
files in the ocaml lib dir, so you could examine the interfaces via
the toplevel...

I remember a mailing post detailing how to implement something similar
to pythons eval using the toplevel.

http://alan.petitepomme.net/cwn/2004.04.13.html#2

Message has been deleted
Message has been deleted
0 new messages