David Topham
2015-01-15 23:54:01 UTC
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
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
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
http://cs.wheaton.edu/~tvandrun/dmfp/).
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
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
http://cs.wheaton.edu/~tvandrun/dmfp/).
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
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.
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
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.