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.