From: John Goerzen <jgoerzen@complete.org>
To: Benjamin Geer <ben@socialtools.net>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] Re: Common IO structure
Date: Thu, 29 Apr 2004 08:23:16 -0500 [thread overview]
Message-ID: <20040429132316.GB11323@excelhustler.com> (raw)
In-Reply-To: <4090E597.1080603@socialtools.net>
On Thu, Apr 29, 2004 at 12:23:03PM +0100, Benjamin Geer wrote:
> >InputStreamReader, OutputStream, OutputStreamWriter, RandomAccessFile,
> >Reader, or Writer. Really, I literally *do not know how to open a
> >simple file*. I would not call that intuitive.
>
> You actually have to *read* the documentation, not just glance at the
> class names. :) That's to be expected with a powerful API. Once you
We were talking about being intuitive here. I'd have to read maybe a
dozen different class descriptions, have to understand the differences
between them, and cross-reference back and forth between them to figure
out how to get the object I want. Or pay for a Java book that describes
these relationships itself.
> understand the key concepts governing the design of the API, it makes
> sense, it and becomes intuitive to select the classes you need. I tried
> to point out these concepts in the message you replied to.
Even when I lived and breathed Java every day for a year, its I/O API
was not intuitive. Actually, most of its APIs were not intuitive.
Everybody I worked with had the Javadoc for the API bookmarked and
referred to it constantly.
In contrast, the API in Python, Perl, or even C is very easy to use.
Here's one of the problems. Java's API makes it complex to do simple
things without simplifying complex things. Recall my example -- being
able to open a file read/write and seeking around in it? In C, I'd do:
int file = open(filename, O_RDWR) or FILE * file = fopen(filename, "r+")
Perl, it is:
open(FH, "+<", $filename)
Or, in Python:
file = open(filename, "r+")
If I don't know my language's code for file modes, I have one simple
place to look.
Now, none of these examples do UTF-8 or other conversions. That's fine.
I usually don't need that. In fact, I dare say that any kind of
conversion like that is by far the minority case.
Java requires me to wade through and think about all of these things
plus the way the file will eventually be used (do I want an array of
bytes, an array of chars, strings, etc?) right when I open it. That's
bad form. Make the open a generic call, and let people build upon the
file object from there. This is how C and Python work. (Perl is a
little wacko with its open call, but it works that way too, mostly.)
> To read a file containing UTF-8 text, one line at a time:
>
> BufferedReader in =
> new BufferedReader
> (new InputStreamReader
> (new FileInputStream(filename), "UTF8"));
>
> while (true)
> {
> String line = in.readLine();
>
> if (line == null)
> {
> break;
> }
>
> System.out.println(line);
> }
But the scary part is that this is about how hard it is to read a file
of ASCII text, one line at a time. Whereas, with Python, I'd do:
for line in open(filename, "r").xreadlines():
print line
See what I mean about intuitive?
But what about UTF-8 in Python?
import codecs
file = codecs.open(filename, "r", "UTF-8")
for line in file.xreadlines():
print line
By all means, if we are going to emulate a design from another language,
let us emulate this one. It is far cleaner and sensible. For more
info, see file:/usr/share/doc/python2.3/html/lib/module-codecs.html.
Essentially, the codecs.open call opens a file handle and returns a
StreamReader object that has the file handle passed in to it. But
here's the key: this StreamReader object is itself a "file-like object"
in Python parlance. That means you can use it everywhere you could have
used a standard file object (assuming the code is capable of handling
Unicode strings, which it usually is.) So you still have the helpful
abstraction of Java without all the mess.
And before you say, "See, Java has a StreamReader too!", note that
codecs defines *4* classes: StreamWriter, StreamReader,
StreamReaderWriter, and StreamRecoder. I can handle that.
> functionality (like buffering). All the classes whose names end in
> 'Stream' deal with bytes only; the ones whose names end in 'Reader' or
> 'Writer' deal with characters. See? It's easy once you know the pattern.
But the point is, this distinction is at the wrong place.
-- John
-------------------
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:[~2004-04-29 13:23 UTC|newest]
Thread overview: 210+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-04-23 18:51 [Caml-list] [ANN] The Missing Library John Goerzen
2004-04-23 19:52 ` Kenneth Knowles
2004-04-23 20:09 ` Alexander V. Voinov
2004-04-23 20:27 ` John Goerzen
2004-04-23 20:23 ` John Goerzen
2004-04-23 20:36 ` Maxence Guesdon
2004-04-23 21:10 ` John Goerzen
2004-04-23 21:12 ` Maxence Guesdon
2004-04-23 21:18 ` Maxence Guesdon
2004-04-23 21:32 ` Nicolas Cannasse
2004-04-23 21:46 ` John Goerzen
2004-04-23 21:58 ` Maxence Guesdon
2004-04-24 8:15 ` Matthieu BRUCHER
2004-04-24 8:15 ` Maxence Guesdon
2004-04-23 21:36 ` John Goerzen
2004-04-23 21:33 ` John Goerzen
2004-04-23 22:04 ` Alain.Frisch
2004-04-24 4:26 ` John Goerzen
2004-04-24 8:13 ` Alain.Frisch
2004-04-24 9:28 ` Nicolas Cannasse
2004-04-25 8:56 ` Common IO structure (was Re: [Caml-list] [ANN] The Missing Library) Yamagata Yoriyuki
2004-04-25 11:54 ` Gerd Stolpmann
2004-04-26 14:53 ` [Caml-list] Re: Common IO structure Yamagata Yoriyuki
2004-04-26 21:02 ` Gerd Stolpmann
2004-04-25 19:42 ` Common IO structure (was Re: [Caml-list] [ANN] The Missing Library) Nicolas Cannasse
2004-04-26 13:16 ` [Caml-list] Re: Common IO structure Yamagata Yoriyuki
2004-04-26 13:53 ` Jacques GARRIGUE
2004-04-26 14:26 ` Nicolas Cannasse
2004-04-28 6:52 ` Jacques GARRIGUE
2004-04-26 14:23 ` Nicolas Cannasse
2004-04-26 14:55 ` skaller
2004-04-26 15:26 ` Yamagata Yoriyuki
2004-04-26 19:28 ` Nicolas Cannasse
2004-04-26 20:56 ` Gerd Stolpmann
2004-04-26 21:14 ` John Goerzen
2004-04-26 22:32 ` Gerd Stolpmann
2004-04-26 21:52 ` Benjamin Geer
2004-04-27 16:00 ` Yamagata Yoriyuki
2004-04-27 21:51 ` Gerd Stolpmann
2004-04-27 19:08 ` Nicolas Cannasse
2004-04-27 22:22 ` Gerd Stolpmann
2004-04-28 7:42 ` Nicolas Cannasse
2004-04-29 10:13 ` Yamagata Yoriyuki
2004-04-27 15:43 ` Yamagata Yoriyuki
2004-04-27 16:17 ` Nicolas Cannasse
2004-04-27 16:58 ` Yamagata Yoriyuki
2004-04-27 23:35 ` Benjamin Geer
2004-04-28 3:44 ` John Goerzen
2004-04-28 13:01 ` Richard Jones
2004-04-28 21:30 ` Benjamin Geer
2004-04-28 21:44 ` John Goerzen
2004-04-28 22:41 ` Richard Jones
2004-04-29 11:51 ` Benjamin Geer
2004-04-29 12:03 ` Richard Jones
2004-04-29 15:16 ` Benjamin Geer
2004-04-29 10:27 ` Yamagata Yoriyuki
2004-04-29 13:03 ` John Goerzen
2004-04-29 13:40 ` Yamagata Yoriyuki
2004-04-29 14:02 ` John Goerzen
2004-04-29 15:31 ` Yamagata Yoriyuki
2004-04-29 17:31 ` james woodyatt
2004-04-29 23:53 ` Benjamin Geer
2004-04-30 4:10 ` james woodyatt
2004-04-29 11:23 ` Benjamin Geer
2004-04-29 12:23 ` Richard Jones
2004-04-29 15:10 ` Benjamin Geer
2004-04-29 15:35 ` John Goerzen
2004-04-29 15:46 ` Benjamin Geer
2004-04-29 15:58 ` Richard Jones
2004-04-29 20:41 ` John Goerzen
2004-04-29 22:35 ` Benjamin Geer
2004-05-01 14:37 ` Brian Hurt
2004-04-29 13:23 ` John Goerzen [this message]
2004-04-29 14:12 ` John Goerzen
2004-04-29 15:37 ` Benjamin Geer
2004-04-28 7:05 ` Nicolas Cannasse
2004-04-28 0:20 ` skaller
2004-04-28 3:39 ` John Goerzen
2004-04-28 13:04 ` Richard Jones
2004-04-24 9:40 ` [Caml-list] [ANN] The Missing Library Oliver Bandel
2004-04-23 22:54 ` Henri DF
2004-04-23 23:11 ` Shawn Wagner
2004-04-25 6:55 ` james woodyatt
2004-04-25 7:56 ` Brandon J. Van Every
2004-04-25 11:50 ` Benjamin Geer
2004-04-25 13:55 ` skaller
2004-04-26 12:08 ` Martin Berger
2004-04-26 12:51 ` skaller
2004-04-26 14:49 ` skaller
2004-04-28 4:31 ` Brian Hurt
2004-04-28 5:13 ` Jon Harrop
2004-04-28 8:37 ` skaller
2004-04-28 9:18 ` Jon Harrop
2004-04-28 11:24 ` skaller
2004-04-28 15:18 ` John Goerzen
2004-04-28 16:28 ` skaller
2004-04-28 18:02 ` John Goerzen
2004-04-29 0:54 ` skaller
2004-04-29 11:57 ` Andreas Rossberg
2004-04-29 13:38 ` John Goerzen
2004-04-28 18:42 ` Jon Harrop
2004-04-29 1:03 ` skaller
2004-04-29 1:56 ` Jon Harrop
2004-04-29 2:35 ` skaller
2004-04-29 3:00 ` skaller
2004-04-29 5:04 ` Jon Harrop
2004-04-29 5:38 ` skaller
2004-04-29 5:47 ` james woodyatt
2004-04-29 12:05 ` Andreas Rossberg
2004-04-28 17:07 ` james woodyatt
2004-04-28 17:31 ` skaller
2004-05-03 0:02 ` Marcin 'Qrczak' Kowalczyk
2004-05-03 7:54 ` skaller
2004-05-03 8:58 ` Marcin 'Qrczak' Kowalczyk
2004-05-03 10:58 ` skaller
2004-05-03 12:40 ` Marcin 'Qrczak' Kowalczyk
2004-05-03 13:04 ` Nicolas Cannasse
2004-05-03 14:24 ` brogoff
2004-05-03 15:26 ` Marcin 'Qrczak' Kowalczyk
2004-05-03 15:08 ` skaller
2004-05-03 16:00 ` Marcin 'Qrczak' Kowalczyk
2004-05-03 11:32 ` [Caml-list] Re: Tail-calls in C code (was: [ANN] The Missing Library) Wolfgang Lux
2004-05-03 12:34 ` skaller
2004-05-03 12:38 ` skaller
2004-05-03 12:55 ` skaller
2004-05-03 13:02 ` Marcin 'Qrczak' Kowalczyk
2004-04-28 15:15 ` [Caml-list] [ANN] The Missing Library John Goerzen
2004-04-28 20:43 ` Jon Harrop
2004-04-30 15:58 ` Brian Hurt
2004-05-01 2:48 ` skaller
2004-04-28 8:24 ` skaller
2004-04-28 8:42 ` Martin Berger
2004-04-28 11:38 ` skaller
2004-04-28 16:07 ` [Caml-list] " Shivkumar Chandrasekaran
2004-04-28 11:31 ` [Caml-list] " Yaron M. Minsky
2004-04-28 12:09 ` skaller
2004-04-28 12:36 ` Nicolas Cannasse
2004-04-28 13:39 ` skaller
2004-04-28 14:02 ` Nicolas Cannasse
2004-04-28 15:34 ` skaller
2004-04-28 13:15 ` Jean-Christophe Filliatre
2004-04-28 14:31 ` skaller
2004-04-28 14:40 ` Jean-Christophe Filliatre
2004-04-28 15:51 ` skaller
2004-04-28 13:29 ` Andreas Rossberg
2004-04-28 16:10 ` [Caml-list] " Shivkumar Chandrasekaran
2004-04-28 17:14 ` skaller
2004-04-28 17:34 ` Shivkumar Chandrasekaran
2004-04-28 20:00 ` Jon Harrop
2004-04-25 12:20 ` [Caml-list] " Benjamin Geer
2004-04-25 14:06 ` skaller
2004-04-25 15:07 ` Benjamin Geer
2004-04-26 0:19 ` skaller
2004-04-23 22:08 ` Basile STARYNKEVITCH
2004-04-24 4:40 ` John Goerzen
2004-04-24 10:10 ` Oliver Bandel
2004-04-24 19:31 ` skaller
2004-04-23 20:54 ` Kenneth Knowles
2004-04-23 21:07 ` John Goerzen
2004-04-25 15:43 ` Brian Hurt
2004-04-26 0:22 ` skaller
2004-04-28 4:10 ` Brian Hurt
2004-04-26 6:48 ` Florian Hars
2004-04-23 20:41 ` Eric C. Cooper
2004-04-23 21:16 ` John Goerzen
2004-04-23 22:28 ` Shawn Wagner
2004-04-23 22:37 ` Kenneth Knowles
2004-04-23 23:16 ` Shawn Wagner
2004-04-24 1:38 ` [Caml-list] ocamlopt -pack portability John Carr
2004-04-24 10:31 ` Oliver Bandel
2004-04-24 16:53 ` John Carr
2004-04-24 4:46 ` [Caml-list] [ANN] The Missing Library John Goerzen
2004-04-24 2:43 ` Yamagata Yoriyuki
2004-04-24 9:19 ` Nicolas Cannasse
2004-04-24 12:27 ` Shawn Wagner
2004-04-24 12:58 ` Alain.Frisch
2004-04-24 17:36 ` Nicolas Cannasse
2004-04-26 14:49 ` Florian Hars
2004-04-24 2:44 ` Yamagata Yoriyuki
2004-04-24 4:51 ` John Goerzen
2004-04-24 5:11 ` Jon Harrop
2004-04-24 12:59 ` Proposal: community standard library project (was: Re: [Caml-list] [ANN] The Missing Library) Benjamin Geer
2004-04-24 17:29 ` [Caml-list] RE: Proposal: community standard library project Brandon J. Van Every
2004-04-24 18:23 ` Benjamin Geer
2004-04-25 4:37 ` Brandon J. Van Every
2004-04-26 1:45 ` [Caml-list] " Jacques GARRIGUE
2004-04-26 3:03 ` Brandon J. Van Every
2004-04-26 7:43 ` Martin Jambon
2004-04-26 18:25 ` Benjamin Geer
2004-04-26 19:37 ` Gerd Stolpmann
2004-04-26 20:24 ` skaller
2004-04-26 20:39 ` John Goerzen
2004-04-26 22:17 ` Brandon J. Van Every
2004-04-27 9:06 ` skaller
2004-04-27 9:35 ` Alain.Frisch
2004-04-27 11:29 ` Gerd Stolpmann
2004-04-27 12:52 ` skaller
2004-04-27 18:13 ` [Caml-list] CVS labeling (was Re: Proposal: community standard library project) Brandon J. Van Every
2004-04-27 18:53 ` John Goerzen
2004-05-03 6:12 [Caml-list] Re: Common IO structure Vladimir N. Silyaev
2004-05-04 21:31 ` Benjamin Geer
2004-05-04 22:59 ` Yamagata Yoriyuki
2004-05-05 8:11 ` skaller
2004-05-05 15:48 ` Marcin 'Qrczak' Kowalczyk
2004-05-05 19:28 ` skaller
2004-05-05 17:33 ` Vladimir N. Silyaev
2004-05-05 17:31 ` Vladimir N. Silyaev
2004-05-07 22:11 ` Benjamin Geer
2004-05-08 7:29 ` Vladimir N. Silyaev
2004-05-09 17:35 ` Benjamin Geer
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=20040429132316.GB11323@excelhustler.com \
--to=jgoerzen@complete.org \
--cc=ben@socialtools.net \
--cc=caml-list@inria.fr \
/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