From: Oleg <oleg_inconnu@myrealbox.com>
To: John Max Skaller <skaller@ozemail.com.au>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] productivity improvement
Date: Mon, 15 Jul 2002 23:34:17 -0400 [thread overview]
Message-ID: <200207160333.XAA13573@dewberry.cc.columbia.edu> (raw)
In-Reply-To: <3D2C5538.2090901@ozemail.com.au>
On Wednesday 10 July 2002 11:39 am, John Max Skaller wrote:
> Oleg wrote:
> >What are the _simplest_ examples that demonstrate considerable (> 2:1)
> > O'Caml vs C++ productivity improvement (in terms of program size) and
> > where can I find them?
>
> Try doing this in C++:
>
> type 'a node = Leaf of 'a | Unop of ('a->'a) * node | Binop of ('a *
> 'a -> 'a)
> let rec eval n = match n with
>
> | Leaf i -> i
> | Unop (f,n) -> f (eval n)
> | Binop (f,n1,n2) -> f ((eval n1), (eval n2))
>
> [Hint: it cannot be done without one of:
> a) casts, or
> b) serious difficulties wth memory management
> ]
Shame on you! I hear you are on the C++ standardization committee :)
Code first [1], comments below.
<C++>
1 #include <iostream>
2 #include <cmath>
3
4 template<class T>
5 struct node {
6 virtual T eval() = 0;
7 };
8
9 template<class T>
10 struct leaf : public node<T> {
11 T i;
12 T eval() { return i; }
13 leaf(const T& t) : i(t) {};
14 };
15
16 template<class T>
17 struct unop : public node<T> {
18 T (*fun)(T);
19 node<T>& n;
20 T eval() { return fun(n.eval()); }
21 unop(T (*f)(T), node<T>& N) : fun(f), n(N) {}
22 };
23
24 template<class T>
25 struct binop : public node<T> {
26 T (*fun)(T, T);
27 node<T> &n1;
28 node<T> &n2;
29 T eval() { return fun(n1.eval(), n2.eval()); }
30 binop(T (*f)(T, T), node<T>& N1, node<T>& N2) : fun(f), n1(N1),
n2(N2) {}
31 };
32
33 int main() {
34 typedef node<double> N;
35 typedef leaf<double> L;
36 typedef unop<double> U;
37 typedef binop<double> B;
38 L a(4);
39 U b(std::sin, a);
39 U b(std::sin, a);
40 U c(std::cos, a);
41 B d(std::atan2, b, c);
42 std::cout << d.eval() << '\n';
43 }
</C++>
As one can see, the code is reasonably idiomatic C++, there are no casts or
explicit memory management. Templates are used only for genericity. If one
looks past the superficial syntax differences, the C++ code is not even much
more verbal than the O'Caml example, namely:
1) one needs to define the abstract (interface) class instead of O'Caml's
succinct "type 'a node = ".
2) writing "template<class T>", "struct", ": public node<T>", "};" adds to
program size, while decreasing readability and compilation speed. But writing
these really happens without much thinking.
3) constructors do have to be written manually, but that's only 3 LOC total
(1 per each derived class / variant), and they are very simple and idiomatic.
4) as used in "main()", the C++ code will not take any "abstraction" [2]
performance pentalty
John's example was still very interesting [3], thanks: we've learned that
O'Caml variant types translate into C++ single inheritance from abstract
classes, not unions. Give me more!
Best regards,
Oleg
P.S. What I do like about C++, is that even though the language claims to be
multi-paradigm, good design is really class-based (structs are classes),
while in O'Caml one has to decide on using classes vs records + HOFs, and
lists vs arrays vs bigarrays. IMHO maybe O'Caml needs fewer types.
[1] I'm no language lawyer, but I think this is 100% ANSI/ISO C++. BTW, it
compiled with "g++-3.0 -pedantic" without warnings or errors.
[2] In C terms, "calling function through a pointer" in node<double>'s
virtual table. There will be no penalty, because the C++ compiler is required
to infer types at compile time here. How about O'Caml? Will it do "match" at
compile time, if possible?
[3] Special Simpsons quote today:
KITENGE: This is the earliest known fossil of a human being. It's over two
million years old.
HOMER: Pff, I've got more bones than that guy. If you're trying to impress
me, you've failed.
KITENGE: It's not the number of bones, sir, it's the...
HOMER: You have failed!
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
next prev parent reply other threads:[~2002-07-16 3:34 UTC|newest]
Thread overview: 129+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-07-08 19:53 Oleg
2002-07-08 20:14 ` Michael Vanier
2002-07-10 15:50 ` John Max Skaller
2002-07-10 18:56 ` Alessandro Baretta
2002-07-10 19:09 ` Jun P.FURUSE
2002-07-11 23:43 ` Pierre Weis
[not found] ` <15657.61603.221054.289184@spike.artisan.com>
2002-07-09 4:43 ` [Caml-list] Universal Serializer (was: productivity improvement) Oleg
2002-07-09 7:56 ` Nicolas Cannasse
2002-07-09 7:59 ` Nicolas Cannasse
2002-07-10 16:06 ` John Max Skaller
2002-07-10 22:29 ` Michael Vanier
2002-07-11 8:13 ` Nicolas Cannasse
2002-07-12 12:41 ` John Max Skaller
2002-07-14 12:25 ` [Caml-list] Statically detecting arrays bound exceptions ?? (was: Universal Serializer) Berke Durak
2002-07-14 13:24 ` Alessandro Baretta
2002-07-15 8:23 ` Xavier Leroy
2002-07-15 8:39 ` Noel Welsh
2002-07-15 21:22 ` Oleg
2002-07-15 22:44 ` Michael Vanier
2002-07-16 6:43 ` Florian Hars
2002-07-16 20:22 ` [Caml-list] " John Max Skaller
2002-07-16 20:36 ` Johan Baltié
2002-07-16 20:55 ` Hao-yang Wang
2002-07-17 8:25 ` Noel Welsh
2002-07-12 1:41 ` [Caml-list] Universal Serializer (was: productivity improvement) Eray Ozkural
2002-07-12 8:10 ` [Caml-list] OCaml QT bindings Stefano Zacchiroli
2002-07-12 17:30 ` Eray Ozkural
2002-07-12 10:37 ` [Caml-list] Re: productivity improvement Oleg
2002-07-12 11:23 ` Markus Mottl
2002-07-12 11:34 ` Oleg
2002-07-12 11:43 ` Markus Mottl
2002-07-12 12:59 ` Pierre Weis
2002-07-12 16:42 ` Markus Mottl
2002-07-14 20:44 ` Dave Berry
2002-07-14 22:13 ` Markus Mottl
2002-07-15 16:43 ` Alwyn Goodloe
2002-07-16 20:14 ` Dave Berry
2002-07-17 3:21 ` Eric Merritt
2002-07-15 9:39 ` Alessandro Baretta
2002-10-15 8:38 ` Eray Ozkural
2002-10-17 21:27 ` Dave Berry
2002-10-18 2:48 ` Eray Ozkural
2002-10-20 12:46 ` Dave Berry
2002-10-21 6:11 ` Michael Vanier
2003-05-10 20:41 ` Eray Ozkural
2002-07-12 11:43 ` Noel Welsh
2002-07-12 12:10 ` Markus Mottl
2002-07-12 13:44 ` John Max Skaller
2002-07-12 16:19 ` Alan Schmitt
2002-07-12 20:41 ` John Carr
2002-07-13 21:19 ` [Caml-list] Re: productivity improvementu Pierre Weis
2002-07-12 21:24 ` [Caml-list] Re: productivity improvement Brian Smith
2002-10-15 8:57 ` Eray Ozkural
2002-10-15 11:50 ` [Caml-list] eproductivity improvement Alessandro Baretta
2002-07-09 12:45 ` [Caml-list] productivity improvement Basile STARYNKEVITCH
2002-07-09 18:20 ` Shannon --jj Behrens
2002-07-09 19:16 ` Oleg
2002-07-09 20:31 ` Shannon --jj Behrens
2002-07-10 10:02 ` sebastien FURIC
2002-07-10 11:58 ` Dave Mason
2002-07-10 13:11 ` sebastien FURIC
2002-07-10 19:22 ` nadji
2002-07-10 20:15 ` Sieve of Eratosthenes Performance: various languages (Re: [Caml-list] productivity improvement) Oleg
2002-07-10 20:34 ` [Caml-list] " William D. Neumann
2002-07-10 20:47 ` [Caml-list] Re: Sieve of Eratosthenes Performance: various languages Alexander V.Voinov
2002-07-10 21:16 ` William D. Neumann
2002-07-10 20:49 ` [Caml-list] Re: Sieve of Eratosthenes Performance: various languages (Re: [Caml-list] productivity improvement) William D. Neumann
2002-07-11 22:30 ` [Caml-list] Array.resize ? Oleg
2002-07-11 23:06 ` Alessandro Baretta
2002-07-12 13:01 ` John Max Skaller
2002-07-12 18:24 ` Shawn Wagner
2002-07-11 23:31 ` Markus Mottl
2002-07-12 12:54 ` John Max Skaller
2002-07-12 13:23 ` Olivier Andrieu
2002-07-12 14:05 ` John Max Skaller
2002-07-12 16:09 ` Brian Rogoff
2002-10-19 9:16 ` Eray Ozkural
2002-10-19 22:15 ` [Caml-list] debugger losing contact with debuggee process Lex Stein
2002-10-20 10:06 ` Pierre Weis
2002-10-21 9:11 ` Xavier Leroy
2002-10-18 3:05 ` [Caml-list] Array.resize ? Eray Ozkural
2002-10-19 1:51 ` Oleg
2003-05-10 20:24 ` Eray Ozkural
2002-07-10 20:48 ` Sieve of Eratosthenes Performance: various languages (Re: [Caml-list] productivity improvement) Markus Mottl
2002-07-11 5:53 ` Anton E. Moscal
2002-10-18 3:07 ` Eray Ozkural
2002-07-10 15:39 ` [Caml-list] productivity improvement John Max Skaller
2002-07-11 8:57 ` Nicolas barnier
2002-07-12 12:16 ` [Caml-list] Is this a bug? John Max Skaller
2002-07-12 14:05 ` Xavier Leroy
2002-07-16 3:34 ` Oleg [this message]
2002-10-18 3:13 ` [Caml-list] productivity improvement Eray Ozkural
[not found] <200207092004.QAA09587@psi-phi.mit.edu>
2002-07-09 20:16 ` Oleg
[not found] <20020716172916.4903.qmail@web10702.mail.yahoo.com>
2002-07-18 23:14 ` Oleg
2002-07-18 23:27 ` Brian Smith
2002-07-18 23:54 ` William Lovas
2002-07-19 3:59 ` Oleg
[not found] ` <20020719010318.B3631@boson.den.co.bbnow.net>
2002-07-19 8:22 ` Oleg
2002-07-19 8:57 ` Andreas Rossberg
2002-07-19 10:14 ` Alessandro Baretta
2002-07-19 18:15 ` John Max Skaller
2002-07-19 18:33 ` Brian Smith
2002-07-20 17:30 ` John Max Skaller
2002-07-19 19:06 ` Alessandro Baretta
2002-07-20 17:49 ` John Max Skaller
2002-07-19 10:34 ` Oleg
2002-07-19 17:25 ` Andreas Rossberg
2002-07-20 16:58 ` John Max Skaller
2002-07-19 16:35 ` Brian Rogoff
2002-10-16 23:24 ` Eray Ozkural
2002-07-19 1:25 ` Alessandro Baretta
2002-07-19 4:04 ` Oleg
2002-10-15 9:31 ` Eray Ozkural
2002-10-15 12:34 ` Oleg
2002-10-15 15:08 ` Eray Ozkural
2002-07-19 4:42 ` Emmanuel Renieris
2002-07-19 9:57 ` Oleg
2002-07-19 10:43 ` Alessandro Baretta
2002-07-19 10:52 ` Daniel de Rauglaudre
2002-07-19 11:36 ` Alessandro Baretta
2002-07-19 11:10 ` Xavier Leroy
2002-10-15 9:24 ` Eray Ozkural
2002-10-15 18:47 ` Pal-Kristian Engstad
2002-10-17 0:12 ` Eray Ozkural
2002-10-17 9:34 ` Diego Olivier Fernandez Pons
2002-10-17 15:55 ` Jeffrey Palmer
2002-10-17 16:15 ` brogoff
2002-10-18 10:43 ` Diego Olivier Fernandez Pons
2002-10-21 8:57 ` Francois Pottier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200207160333.XAA13573@dewberry.cc.columbia.edu \
--to=oleg_inconnu@myrealbox.com \
--cc=caml-list@inria.fr \
--cc=skaller@ozemail.com.au \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).