Thanks David for your response.
While searching I found this comment you made earlier:
"The foreign-function interface allows for call-back functions so there is the mechanism to produce a C function that when called calls an ML function."
in http://stackoverflow.com/questions/17580386/shared-libraries-in-poly-ml
Doesn't this indicate a mechanism that allows an SML function to be called from C?
I accept your answer though, and wonder then if continuing exploration of toolkit wrappers such as the Motif interface is the best bet for adding a GUI to ML?
I wonder how projects such as Isabelle and ProofPower integrate a GUI? If anyone has suggestions I would appreciate it. My goal is not an elaborate interface--just simple I/O with labels, images, buttons, and text input to explore functional approaches.
-Dave
On Fri, Jan 16, 2015 at 4:00 AM, <polyml-request at inf.ed.ac.uk> wrote:
Send polyml mailing list submissions to polyml at inf.ed.ac.uk
To subscribe or unsubscribe via the World Wide Web, visit http://lists.inf.ed.ac.uk/mailman/listinfo/polyml or, via email, send a message with subject or body 'help' to polyml-request at inf.ed.ac.uk
You can reach the person managing the list at polyml-owner at inf.ed.ac.uk
When replying, please edit your Subject line so it is more specific than "Re: Contents of polyml digest..."
Today's Topics:
- linking polyML modules to C (David Topham)
Message: 1 Date: Thu, 15 Jan 2015 15:54:01 -0800 From: David Topham <dtopham at gmail.com> To: polyml at inf.ed.ac.uk Subject: [polyml] linking polyML modules to C Message-ID: < CAD034BGnBz3tXwiVUAHVsoyvcBVg1K125jwcz4J86optWyA6pw at mail.gmail.com> Content-Type: text/plain; charset="utf-8"
After more experimenting with GUI in SML, I would like to now try calling an SML module from a C program. That way, the GUI could be built using traditional imperative techniques and the program logic could be written in SML. I see how to call a C function from SML, but and not so clear on how to call an SML function from a C program. I want to build code using polyc and then link with a C main program, but could anyone show me a simple example of calling that function and getting its return value? for example, I have defined:
fun sum i n f = if i > n then 0.0 else f i + sum (i+1) n f ; fun int2real x = real x ;
in linkToC.sml
and
#include <iostream> #include <fstream> std::ofstream ofs; int main() { std::cout << sum(1,10,int2real) << std::endl; ofs.open("table.dat"); for(int i = 0; i < 20; i++) ofs << i << '\t' << sum(1,i,int2real) << std::endl; }
in linkToC.cpp
Looking in the polyc script, I thought adding the -c option might allow me to build the object code which I could then link to the sml functions, but it complains about not having a main.
Could someone point me in the right direction? Thanks, Dave
On Mon, Dec 15, 2014 at 11:44 AM, David Topham <dtopham at gmail.com> wrote:
David, Thank you so much! I really appreciate your help with this. Your sample below builds fine with polyc on my system (PolyML 5.5.2). I am
using
a minimal Linux distribution named TinyCore ( http://distro.ibiblio.org/tinycorelinux/) which comes with OpenMotif 2.3.3 It runs in a virtual machine within another computer only taking
up
a few hundred MBs!
I am going to use it to help my students explore Discrete Math next semester (this textbook uses SML for that purpose: http://cs.wheaton.edu/~tvandrun/dmfp/).
I also found a reasonably current project using PolyML and Motif here: http://www.lemma-one.com/ProofPower/index/
...however it was built on PolyML 4 and has not yet been ported to the newer version (e.g. depends on PolyML.commit which no longer seems to be supported).
Happy Holidays to everyone in the PolyML community!
-David Topham
Re: GUI Interface (David Matthews)
I've experimented with building a stand-alone executable with Motif and succeeded in getting it to work for me using polyc. (It required building Poly/ML with --with-x). I took the example from http://www.polyml.org/docs/Motif.html and wrapped it up in a function. I did find a problem, though. It looks as though the function has to suspend itself with something like Posix.Process.pause otherwise nothing happens. I seem to recall that the Motif stuff is handled on a separate thread to allow the REPL to continue to accept commands. With a stand-alone application there isn't a REPL so without the "pause" it terminates immediately.
David
open XWindows ; open Motif ;
fun main() = let val shell = XtAppInitialise "" "xed" "Editor" [] [XmNwidth 400, XmNheight 400]
;
val main = XmCreateMainWindow shell "main" [] ;
val bar = XmCreateMenuBar main "bar" [] ;
val fileMenu = XmCreateCascadeButton bar "file" [XmNlabelString "File"]
;
val editMenu = XmCreateCascadeButton bar "edit" [XmNlabelString "Edit"]
;
val viewMenu = XmCreateCascadeButton bar "view" [XmNlabelString "View"]
;
val helpMenu = XmCreateCascadeButton bar "help" [XmNlabelString "Help"]
;
val command = XmCreateText main "command" [XmNeditMode XmSINGLE_LINE_EDIT] ;
val hscroll = XmCreateScrollBar main "hscroll" [XmNorientation XmHORIZONTAL] ; val vscroll = XmCreateScrollBar main "vscroll" [XmNorientation XmVERTICAL] ;
val work = XmCreateDrawingArea main "work" [] ; in
XtManageChildren [fileMenu, editMenu, viewMenu, helpMenu] ; XtManageChildren [bar, command, hscroll, vscroll, work] ;
XmMainWindowSetAreas main bar command hscroll vscroll work ;
XtManageChild main ; XtRealizeWidget shell; Posix.Process.pause() end;
polyml mailing list polyml at inf.ed.ac.uk http://lists.inf.ed.ac.uk/mailman/listinfo/polyml
End of polyml Digest, Vol 110, Issue 12
-- The University of Edinburgh is a charitable body, registered in Scotland, with registration number SC005336.
David Topham wrote:
"The foreign-function interface allows for call-back functions so there is the mechanism to produce a C function that when called calls an ML function."
in http://stackoverflow.com/questions/17580386/shared-libraries-in-poly-ml
Doesn't this indicate a mechanism that allows an SML function to be called from C?
It is possible with MLton:
http://mlton.org/CallingFromCToSML
with a caveat:
"Unfortunately, MLton?s support for exporting ML functions to C only allows one instance of the function to exist. Thus, we have to keep an ML-side registry of windows and their callback functions, which is used to multiplex the the single instance of the callback."
http://sml3d.cs.uchicago.edu/papers/ml14-sml3d/paper.pdf
This paper is worth reading for its discussion of interfacing OpenGL as well.
- Gergely
On 19/01/2015 04:34, David Topham wrote:
Thanks David for your response.
While searching I found this comment you made earlier:
"The foreign-function interface allows for call-back functions so there is the mechanism to produce a C function that when called calls an ML function."
in http://stackoverflow.com/questions/17580386/shared-libraries-in-poly-ml
Doesn't this indicate a mechanism that allows an SML function to be called from C?
Yes, but the "main program" still has to be in ML. You can call C library functions and pass an ML function as an argument.
Actually, I did wonder whether this could be used as a way of exporting ML functions to create a library that could be called from a C main program and came to the conclusion that it was going to be too complicated. Poly/ML uses libffi to interface with C. libffi can build closures that wrap around ML functions so that these can be passed into C. The format of the closure it constructs differs markedly depending on the particular architecture since different architectures have different calling conventions for C. The closure is a data structure with pointers in it. Exporting it would require turning the pointers into relocations that the linker/loader will understand. libffi simply doesn't provide that information. It's there by implication in the source code but not explicitly.
David
19/01/15 12:19, David Matthews wrote:
On 19/01/2015 04:34, David Topham wrote:
Thanks David for your response.
While searching I found this comment you made earlier:
"The foreign-function interface allows for call-back functions so there is the mechanism to produce a C function that when called calls an ML function."
in http://stackoverflow.com/questions/17580386/shared-libraries-in-poly-ml
Doesn't this indicate a mechanism that allows an SML function to be called from C?
Yes, but the "main program" still has to be in ML. You can call C library functions and pass an ML function as an argument.
Or the ML functions can be passed via global variables that are initialized from the ML side - see attached example. That may be easier if there are a large number of ML functions.
Actually, I did wonder whether this could be used as a way of exporting ML functions to create a library that could be called from a C main program and came to the conclusion that it was going to be too complicated. Poly/ML uses libffi to interface with C. libffi can build closures that wrap around ML functions so that these can be passed into C. The format of the closure it constructs differs markedly depending on the particular architecture since different architectures have different calling conventions for C. The closure is a data structure with pointers in it. Exporting it would require turning the pointers into relocations that the linker/loader will understand. libffi simply doesn't provide that information. It's there by implication in the source code but not explicitly.
David _______________________________________________ polyml mailing list polyml at inf.ed.ac.uk http://lists.inf.ed.ac.uk/mailman/listinfo/polyml