Re: IO Multiplexing

2010-11-12 Thread Leon Timmermans
On Fri, Nov 12, 2010 at 8:21 PM, Stefan O'Rear stefa...@cox.net wrote:
 This goes without saying.  One caveat - it should be possible to pass
 integer file descriptors.

Integer file descriptions should exist in the POSIX module, just like
Win32 handles should exist in the Win32 module, but they don't have a
place in the standard IO. That said, some kind of cross-platform
opaque type for low level IO handles may be useful, if only for
comparisons.

 Absolutely not.  TIMTOWDI.  There will be a select() function (in
 the POSIX module, not the default namespace!), and it will take
 parameters as close as possible to POSIX.1's definition.  Perl without
 system calls is not Perl.

I agree.

 TIMTOWDI.  Perl without system calls is not Perl.

True, but those other ways don't necessarily have to be part of the
standard IO, or even the core.

Leon


Re: Lessons to learn from ithreads (was: threads?)

2010-10-15 Thread Leon Timmermans
On Wed, Oct 13, 2010 at 1:13 PM, Tim Bunce tim.bu...@pobox.com wrote:
 If you wanted to start a hundred threads in a language that has good
 support for async constructs you're almost certainly using the wrong
 approach. In the world of perl6 I expect threads to be used rarely and
 for specific unavoidably-bocking tasks, like db access, and where true
 concurrency is needed.

I agree starting a large number of threads is usually the wrong
approach, but at the same time I see more reasons to use threads than
just avoiding blocking. We live in a multicore world, and it would be
nice if it was easy to actually use those cores. I know people who are
deploying to 24 core systems now, and that number will only grow.
Processes shouldn't be the only way to utilize that.

 (Adding thread/multiplicity support to NYTProf shouldn't be too hard.
 I don't have the time/inclination to do it at the moment, but I'll fully
 support anyone who has.)

I hate how you once again make my todo list grow :-p


Re: Ruby Fibers (was: threads?)

2010-10-15 Thread Leon Timmermans
On Wed, Oct 13, 2010 at 1:20 AM, Tim Bunce tim.bu...@pobox.com wrote:
 I've not used them, but Ruby 1.9 Fibers (continuations) and the
 EventMachine Reactor pattern seem interesting.

Continuations and fibers are incredibly useful and should be easy to
implement on parrot/rakudo but they aren't really concurrency. They're
a solution to a different problem.


Re: threads?

2010-10-12 Thread Leon Timmermans
On Mon, Oct 11, 2010 at 12:32 AM, Ben Goldberg ben-goldb...@hotmail.com wrote:
 If thread-unsafe subroutines are called, then something like ithreads
 might be used.

For the love of $DEITY, let's please not repeat ithreads!


Re: threads?

2010-10-12 Thread Leon Timmermans
On Tue, Oct 12, 2010 at 4:22 PM, Damian Conway dam...@conway.org wrote:
 The problem is: while most people can agree on what have proved to be
 unsatisfactory threading models, not many people can seem to agree on
 what would constititute a satisfactory threading model (or, possibly, models).

 What we really need is some anecdotal evidence from folks who are actually
 using threading in real-world situations (in *any* languages). What has worked
 in practice? What has worked well? What was painful? What was error-prone?
 And for which kinds of tasks?

Most languages either implement concurrency in a way that's not very
useful (CPython, CRuby) or implement it in a way that's slightly
(Java/C/C++) to totally (perl 5) insane. Erlang is the only language
I've worked with whose threads I really like, but sadly it's rather
weak at a lot of other things.

In general, I don't feel that a shared memory model is a good fit for
a high level language. I'm very much a proponent of message passing.
Unlike shared memory, it's actually easier to do the right thing than
not. Implementing it correctly and efficiently is not easier than
doing a shared memory system though in my experience (I'm busy
implementing it on top of ithreads; yeah I'm masochist like that).

 And we also need to stand back a little further and ask: is threading
 the right approach at all? Do threads work in *any* language? Are there
 better metaphors?

 Perhaps we need to think more Perlishly and reframe the entire question.
 Not: What threading model do we need?, but: What kinds of non-sequential
 programming tasks do we want to make easy...and how would we like to be
 able to specify those tasks?

I agree. I would prefer implicit over explicit concurrency wherever possible.


Re: threads?

2010-10-12 Thread Leon Timmermans
On Tue, Oct 12, 2010 at 10:28 PM, B. Estrade estr...@gmail.com wrote:
 I agree. I would prefer implicit over explicit concurrency wherever possible.

 I know you're speaking about the Perl interface to concurrency, but
 you seem to contradict yourself because message passing is explicit
 whereas shared memory is implicit - two different models, both of
 which could be used together to implement a pretty flexible system.

With implicit I mean stuff like concurrent hyperoperators and
junctions. Shared memory systems are explicitly concurrent to me
because you have to ether explicitly lock or explicitly do a
transaction.

 It'd be a shame to not provide a way to both use threads directly or
 to fallback to some implicitly concurrent constructs.

I agree


Re: Lessons to learn from ithreads (was: threads?)

2010-10-12 Thread Leon Timmermans
On Wed, Oct 13, 2010 at 12:46 AM, Tim Bunce tim.bu...@pobox.com wrote:
 So I'd like to use this sub-thread to try to identify when lessons we
 can learn from ithreads. My initial thoughts are:

 - Don't clone a live interpreter.
    Start a new thread with a fresh interpreter.

 - Don't try to share mutable data or data structures.
    Use message passing and serialization.

Actually, that sounds *exactly* like what I have been trying to
implementing for perl 5 based on ithreads (threads::lite, it's still
in a fairly early state though). My experience with it so far taught
me that:

* Serialization must be cheap for this to scale. For threads::lite
this turns out to be the main performance bottleneck. Erlang gets away
with this because it's purely functional and thus doesn't need to
serialize between local threads, maybe we could do something similar
with immutable objects. Here micro-optimizations are going to pay off.

* Code sharing is actually quite nice. Loading Moose separately in a
hundred threads is not. This is not trivial though, Perl being so
dynamic. I suspect this is not possible without running into the same
issues as ithreads does.

* Creating a thread (/interpreter) should be as cheap as possible,
both in CPU-time as in memory. Creating an ithread is relatively
expensive, specially memorywise. You can't realistically create a very
large number of them the way you can in Erlang.

Leon

(well actually I learned a lot more; like about non-deterministic unit
tests and profilers that don't like threads, but that's an entirely
different story)


Re: Suggested magic for a .. b

2010-08-01 Thread Leon Timmermans
On Sun, Aug 1, 2010 at 11:39 PM, Martin D Kealey
mar...@kurahaupo.gen.nz wrote:
 In any case I'd much rather prefer that the behaviour be lexically scoped,
 with either adverbs or pragmata, not with the action-at-a-distance that's
 caused by tagging something as fundamental as a String.

In many cases the collation isn't known at compile-time, so adverbs
would be necessary anyway. Pragma's can make things easier in many
cases.

Leon


Re: Suggested magic for a .. b

2010-07-30 Thread Leon Timmermans
On Thu, Jul 29, 2010 at 9:51 PM, Aaron Sherman a...@ajs.com wrote:
 My only strongly held belief, here, is that you should not try to answer any
 of these questions for the default range operator on
 unadorned, context-less strings. For that case, you must do something that
 makes sense for all Unicode codepoints in nearly all contexts.

I find that both of limited use and the only sane possibility at the
same time :-|

Leon


Re: Suggested magic for a .. b

2010-07-29 Thread Leon Timmermans
On Thu, Jul 29, 2010 at 3:24 AM, Darren Duncan dar...@darrenduncan.net wrote:
 Some possible examples of customization:

  $foo ~~ $a..$b :QuuxNationality  # just affects this one test

I like that

  $bar = 'hello' :QuuxNationality  # applies anywhere the Str value is used


What if you compare a QuuxNationality Str with a FooNationality Str?
That should blow up. Also it can lead to action at a distance. I don't
think that's the way to go.

Leon


Re: Suggested magic for a .. b

2010-07-28 Thread Leon Timmermans
On Wed, Jul 28, 2010 at 11:29 PM, Aaron Sherman a...@ajs.com wrote:
 The more I look at this, the more I think .. and ... are reversed. ..
 has a very specific and narrow usage (comparing ranges) and ... is
 probably going to be the most broadly used operator in the language outside
 of quotes, commas and the basic, C-derived math and logic ops. Many (most?)
 loops will involve  Most array initializers will involve  Why
 are we not calling that ..? Just because we defined .. first, and it
 grandfathered its way in the door? Because it resembles the math op? These
 don't seem like good reasons.

I was thinking the same. Switching them seems better from a huffmanization POV.

Leon


Re: Filesystems and files [Was: Re: The obligation of free stuff: Google Storage]

2010-06-30 Thread Leon Timmermans
On Wed, Jun 30, 2010 at 10:29 AM, Richard Hainsworth
rich...@rusrating.ru wrote:
 Would it make sense to define $*FS as the implied local file system, and
 thus that a bare 'open' is sugar for
 my $fh = $*FS.open('/path/to/directory/filename', :r);

 This then means that there is an implicit
 $*FS.connect();
 that makes the local system available to the program.

 I wonder whether this would also be a way of unifying the program interface
 for difference Operating Systems, in that a program running on a *nix
 machine would have $*FS of type IO::Filesystem::POSIX, while $*FS for a
 Windows machine would have type IO::Filesystem::Windows, etc.

 Then it would be possible, as Aaron has suggested to have
 my $remote-fs = IO::Filesystem::Google.connect(%args);
 my $fh = $remote-fs.open($path-or-url, :r);

 and then treat $fh as specified elsewhere.

 Morover, it would then be possible to do
 $*FS = $remote-fs;

 I would propose that this sort of flexibility would be useful for programs
 that are embedded in other virtual environments, such as browser plugins, or
 programs intended to run on thin clients that do not have their own
 filesystems.


I like this idea. It's flexible and extendable but has sane defaults.

Leon


Re: The obligation of free stuff: Google Storage

2010-06-11 Thread Leon Timmermans
On Thu, Jun 10, 2010 at 2:07 PM, Mark J. Reed markjr...@gmail.com wrote:
 But open is already overloaded in p5, with pipes etc.  We don't want
 to repeat the mistakes of the past, and the fact that open(FH, $foo)
 could run an arbitrary shell command was arguably a mistake, but
 transparent access to storage where possible  is the way to go.

I think that 3 argument open fixed that issue for perl 5: with it you
would have to be way more explicit about wanting to open. I think
something similar would work for me in this case too, a flag like
:remote.

 We can provide a way to limit the behavior when you want - a pragma,
 option to open(), or just sticking file:// in front of a value to
 force its interpretation as a plain pathname - but even then, who
 knows what Fuse filesystem might be mounted and doing strange things
 with your innocuous-looking file access?  I'd rather have that
 flexibility directly supported in the language.

For me that sounds like the wrong default, mostly because I'm worried
about remote file inclusion vulnerabilities.

 Of course, different types of storage have different features; there's
 no completely unified interface.  But to the extent that a cloud disk
 system or document database functions as a collection of data blobs
 accessed by a pathlike key, enabling the standard filesystem access
 pattern for it (in addition to whatever specific functionality it
 needs) makes sense, IMHO.

I fully agree with that.

Leon


Re: The obligation of free stuff: Google Storage

2010-06-10 Thread Leon Timmermans
On Thu, Jun 10, 2010 at 9:15 AM, Richard Hainsworth
rich...@rusrating.ru wrote:
 Ideally [at least, what I would like], managing a file on a remote resource
 should be the same as managing one locally, eg.

 my Amazon $fn = open($path-to-input-file-location/$file-name, :r) or die
 $!;
 for $fn.readlines { };
 $fn.close;

 my Google $fn = open($path-to-output-file-location/$file-name, :w) or die
 $!;
 for @lots-of-data - $item { $fn.say: $item };
 $fn.close;


I agree it should be similar to normal FS interactoin to make matters
as intuitive as possible, but I horrified by the idea of overloading
open() that way. That's a PHP mistake I wouldn't like seeing repeated.
If you want open to do something that's not really opening a file, you
should be explicit about it.

Leon


Re: r30205 - docs/Perl6/Spec

2010-04-02 Thread Leon Timmermans
On Fri, Apr 2, 2010 at 5:59 PM, Aristotle Pagaltzis pagalt...@gmx.de wrote:
 He is saying he can’t see how these differ from each other:

      .doit(1,2,3): { $^a = $^b }       # okay
 +    .doit(1,2,3): { $^a = $^b }       # okay

 Or how these two differ from each other:

 +    .doit(1,2,3):{ $^a = $^b }       # okay
 +    .doit(1,2,3):{ $^a = $^b }       # okay

 (Neither can I.)


Yeah, I only figured what he did mean about 10 second after sending
that email. Guess I shouldn't email before being fully awake in the
morning ;-).

Leon


Re: Ordering in \bbold{C}

2010-03-29 Thread Leon Timmermans
Maybe it's just me, but I don't see the value of having some
*arbitrary* predefined order for complex numbers. If people really
want to order their complex numbers, let them do it themselves in
whatever way they want.

Leon

On Mon, Mar 29, 2010 at 6:10 AM, Darren Duncan dar...@darrenduncan.net wrote:
 I was actually thinking, during the previous thread involving Complex
 numbers ...

 It may not have any practical use, but if one wanted to define an ordering
 for complex numbers that was deterministic and relatively unbiased, a way to
 do this would be based on what I'll call for now the spiral distance.

 Conceptually, you take an infinite length spiral line that starts at and is
 centered on the origin, where for each turn the current spot on the spiral
 increases an infinitesimal radius from the origin, or a distance approaching
 zero, in the calculus sense.  Complex numbers closer to the origin on the
 spiral will be ordered earlier than those further from the spiral.

 Actually calculating this is a simple comparison of the radius and angle
 components of the two complex numbers in the polar coordinate system.  If
 the radius value is different, then the one with the smaller radius is
 ordered before the one with the larger; if the two radius values are the
 same, then the one with the smaller angle is ordered first; if both are the
 same, then the two complex numbers are equal.

 The math is just as simple as a naive comparison that just compares the real
 component and then imaginary component in a cartesian coordinate system, but
 the result is much more reasonable I think.

 This whole principle of distance from origin method of ordering does also,
 I suspect, scale to any number of dimensions; the one-dimensional version is
 simply comparing first the absolute value of the two numbers, and then
 saying that either the positive or negative version orders first.

 -- Darren Duncan



Re: r30205 - docs/Perl6/Spec

2010-03-27 Thread Leon Timmermans
A space between the colon and the opening brace ;-)

Leon

On Sat, Mar 27, 2010 at 2:01 AM, Geoffrey Broadwell ge...@broadwell.org wrote:
 On Fri, 2010-03-26 at 08:38 +0100, pugs-comm...@feather.perl6.nl wrote:
      .doit: { $^a = $^b }              # okay
      .doit(): { $^a = $^b }            # okay
      .doit(1,2,3): { $^a = $^b }       # okay
 +    .doit(1,2,3): { $^a = $^b }       # okay

 +    .doit:{ $^a = $^b }              # okay
 +    .doit():{ $^a = $^b }            # okay
 +    .doit(1,2,3):{ $^a = $^b }       # okay
 +    .doit(1,2,3):{ $^a = $^b }       # okay

 My eyes must be playing tricks on me -- I can't see the difference
 between the last two lines in each of the above blocks.  What am I
 missing?


 -'f





Re: Filename literals

2009-08-18 Thread Leon Timmermans
Reading this discussion, I'm getting the feeling that filename
literals are increasingly getting magical, something that I don't
think is a good development. The only sane way to deal with filenames
is treating them as opaque binary strings, making any more assumptions
is bound to get you into trouble. I don't want to deal with Windows'
strange restrictions on characters when I'm working on Linux. I don't
want to deal with any other platform's particularities either.
Portability should be positive, not negative IMNSHO.

As for comparing paths: reimplementing logic that belongs to the
filesystem sounds like really Bad Idea™ to me. Two paths can't be
reliably compared without choosing to make some explicit assumptions,
and I don't think Perl should make such choices for the programmer.

Leon Timmermans


Re: Filename literals

2009-08-14 Thread Leon Timmermans
On Fri, Aug 14, 2009 at 7:41 PM, David Greendavid.gr...@telus.net wrote:
 Well, we can encode a URI any way we like -- I was thinking of anything up
 to the next whitespace or semicolon, and internal semicolons, etc. being 
 %-encoded.

Semicolons are reserved characters in URIs: inappropriately percentage
encoding semicolons would be in direct violation of rfc3986. Using
them as delimiter would break many perfectly valid URIs. That's
absolutely a no-go IMNSHO.

Breaking up at whitespace should work, see appendix C of RFC 3986 for
recommendations on that.

 Maybe it's more practical to permit only URIs with little to no punctuation
 to be unquoted, and quote anything else?  Not that quoting is such a great
 hardship anyway

Maybe, but if I can't use it half of the time it may as well be
omitted. Quoting should be relatively easy, because URIs have a wide
range of characters that can't be in them anyway.

Leon


Re: slowness in grammar

2009-06-04 Thread Leon Timmermans
If you want to write a fast parser for XML, preventing backtracking is
going to be quite essential. I suspect the problem is your grammar,
not the grammar engine itself. You could post it to perl6-users and
ask for advice on it.

Leon

On Thu, Jun 4, 2009 at 7:25 AM, Richard Hainsworth rich...@rusrating.ru wrote:
 Is this a good place to come with code that runs into speed problems?

 I am writing a program in perl6 to read the xml file from a Sony book
 reader, list the books, and move books into collections (the Sony software
 to do this will only work on windoz and not on wine).

 I have a grammar that works with abbreviated test versions of the xml file,
 but it just hangs with the full version.

 Since I have a line
 my $parsed= sony_grammar(slurp media.xml);

 and the problem is in the parsing, I dont know how to insert trace
 statements to determine at what stage the problem is being generated.

 In addition, there is a great deal in the Synopses about code points and
 backtracking and the like, which I dont quite understand. However, it seems
 to me that an intelligent use of these possibilities could increase the
 efficiency of the parsing, if only I knew how. For example, only three of
 the tags in the file are of interest, and within them three of the
 attributes. So how do I tell the regex engine to skip processing if the tag
 is not of interest?

 Richard



Re: What is U4X?

2009-05-21 Thread Leon Timmermans
On Thu, May 21, 2009 at 4:18 PM, John M. Dlugosz
2nb81l...@sneakemail.com wrote:
 Can someone post a link?

http://svn.pugscode.org/pugs/docs/u4x/README

Google is your friend ;-)


Re: Docstrings in Perl 6

2009-05-06 Thread Leon Timmermans
2009/5/4 Damian Conway dam...@conway.org:

 Each approach has advantages and disadvantages.
 Feedback via this forum would be most welcome.


Most people seem to lean towards the pod comments, though I disagree
with it on a simple ground: aesthetics. Python docstrings aren't just
useful, they are reasonably pretty too, #={} isn't. In fact I'd say
it's pretty fugly. I think that a feature that we intend to be used
often should be more aesthetically pleasing, if only to promote its
use.

Leon


Re: .map/.reduce with larger arity

2009-03-25 Thread Leon Timmermans
On Tue, Mar 10, 2009 at 12:09 AM, Larry Wall la...@wall.org wrote:

 Yes, the only difference between Cfor and Cmap is that you can
 only use Cfor at the start of a statement.  But we're more liberal
 about where statements are expected in Perl 6, so you can say things
 like:

    my @results = do for @list - $x {...};
    my @results = (for @list - $x {...});

 and either of those is equivalent to:

    my @results = map - $x {...}, @list;

 I also Officially Don't Care if you use map in a void context. :)

 Larry


I would propose there to be one difference between for an map: map
should bind its arguments read-only, for should bind them read-write.
That would make at least one bad practice an error.

Leon


Re: AnyEvent

2009-02-25 Thread Leon Timmermans
On Wed, Feb 25, 2009 at 5:56 AM, Timothy S. Nelson
wayl...@wayland.id.au wrote:
        Am I right in guessing that the AnyEvent stuff should go in S17 ?


I would suggest to rename that to Event (since unlike Perl 5 that name
is still available in Perl 6).

Leon


Re: Signals question for S16: IPC / IO / Signals

2009-02-23 Thread Leon Timmermans
I think most forms of IPC should be addons, if only because they have
inherent unportability. Stuff like sockets and pipes should be in
obviously, signals maybe (they have lots of portability issues, but
they may be too often used to just drop), but things like SysV IPC
really shouldn't. Anything more high level should definitely not go in
the core.

Leon

(my apologies to Timothy, who now gets this twice, I screwed up due to
gmail having issues with this mailing list).

On Mon, Feb 23, 2009 at 2:26 AM, Timothy S. Nelson
wayl...@wayland.id.au wrote:
I have a quick question here.  S16 claims to be about IPC, IO, and
 Signals.  So far, it's mostly about IO.  My question is, is it intended that
 IPC and/or signals be part of the core, or should they be converted to
 addons like Form.pm?

Thanks,


 -
 | Name: Tim Nelson | Because the Creator is,|
 | E-mail: wayl...@wayland.id.au| I am   |
 -

 BEGIN GEEK CODE BLOCK
 Version 3.12
 GCS d+++ s+: a- C++$ U+++$ P+++$ L+++ E- W+ N+ w--- V- PE(+) Y+++ PGP-+++
 R(+) !tv b++ DI D G+ e++ h! y-
 -END GEEK CODE BLOCK-




Re: Signals question for S16: IPC / IO / Signals

2009-02-23 Thread Leon Timmermans
On Tue, Feb 24, 2009 at 1:13 AM, Timothy S. Nelson
wayl...@wayland.id.au wrote:
 On Mon, 23 Feb 2009, Leon Timmermans wrote:

 I think most forms of IPC should be addons, if only because they have
 inherent unportability. Stuff like sockets and pipes should be in
 obviously, signals maybe (they have lots of portability issues, but
 they may be too often used to just drop), but things like SysV IPC
 really shouldn't. Anything more high level should definitely not go in
 the core.

Ok, I agree about the SysV IPC.  Files and Sockets are in.  As for
 the rest, I have another question -- should they be part of a Unix-only
 class?


I don't understand your question; what do you mean with 'they' here?
Anything not in the core doesn't have to be specced at all for now.


Re: Temporal revisited

2009-02-20 Thread Leon Timmermans
On Thu, Feb 19, 2009 at 7:26 PM, Dave Rolsky auta...@urth.org wrote:
 After some discussion I made a number of drastic revisions to
 S32-setting-library/Temporal.pod

 What I want to see in Perl 6 is a set of very minimal roles that can be used
 to provide a simply object from gmtime() and localtime(). These objects
 should not handle locales, proper Olson timezones, string parsing,
 user-defined formatting, or math.

 They're basically simply little data blobs with some overloading and a few
 handy methods.

 I imagine that a real classes which do math, handle leap seconds,
 formatting, and so on will _also_ do these roles, but this should be done
 out of core.

 I don't really know Perl 6 all that well, so I'd welcome review, in
 particular of my Perl 6-isms, and also just of the general concepts.


Why should an Instant be a role, and not a concrete class? What would
one instant do that another can't? Representing a specific moment in
time sounds like a very concrete thing to me.

Leon


Re: r25373 - docs/Perl6/Spec

2009-02-18 Thread Leon Timmermans
 +role   Date {
 +   has Calendar $.calendar;
 +   has NumberName $.year;
 +   has NumberName $.month;
 +   has NumberName $.dayofmonth;
 +   has NumberName $.dayofweek;
 +   has NumberName $.dayofyear;
 +   has NumberName $.dayofquarter;
 +   has NumberName $.quarter;
 +   has NumberName $.era; # 'Common', 'Christian', etc
 +   has Str $.defaultformat;

Shouldn't these be methods instead of attributes?

Leon


Re: r25371 - docs/Perl6/Spec

2009-02-18 Thread Leon Timmermans
On Wed, Feb 18, 2009 at 12:16 PM, Timothy S. Nelson
wayl...@wayland.id.au wrote:
 On Wed, 18 Feb 2009, Leon Timmermans wrote:

The only difference I could see was that shutdown allows changing the
 readability and writeability.  While I agree that this functionality should
 be exposed, (see my next update), I think that in the general case, .close()
 plus the other stuff I've done should be sufficient.  Maybe shutdown()
 should be exposed somewhere, though.


You are missing one very important thing about shutdown: its effect is
on the connection and thus global. It also affects other processes
that share the same socket. close() OTOH is local. It only affects the
file descriptor, and only in the current process.

Leon


Re: r25328 - docs/Perl6/Spec

2009-02-14 Thread Leon Timmermans
On Sat, Feb 14, 2009 at 6:38 AM,  pugs-comm...@feather.perl6.nl wrote:
 +=head2 IO::Openable
 +
 +This role implies that the object can be connected to, or listened on.
 +
 +=over 4
 +
 +=item open
 +
 + method Bool open();
 +
 +Attempts to open the handle.  Depending on the implementation, this could be 
 an open()
 +call, a connect(), a listen(), or something similar.
 +
 +=back
 +

I'm not sure if I really hate or love this. I'm not quite convinced if
the use of it anyway.

 +=head2 IO::Socket
 +
 +role   IO::Socket does IO::POSIX does IO::Openable does IO::Closeable {
 +...
 +}
 +
 +=over
 +
 +=item IO.accept
 +
 +=item IO.bind
 +
 +=item Socket.pair
 +
 +our List of IO method pair(Int $domain, Int $type, Int $protocol)
 +
 +A wrapper for socketpair(2), returns a pair of IO objects representing the
 +reader and writer ends of the socket.
 +
 +   use Socket;
 +   ($r, $w) = Socket.pair(AF_UNIX, SOCK_STREAM, PF_UNSPEC);
 +
 +
 +=back
 +

Why should this do POSIX? What about non-POSIX operating systems?

 +=item syscall
 +

That functions should be well hidden

 +=item sysopen
 +

I vote for sysopen (and all other sys functions) to be wiped out of existence.

 +=head1 Classes
 +
 +=head2 IO::File
 +
 +This does file input and output.
 +
 +class  IO::File does IO::POSIX does IO::Closeable does IO::Openable {
 +...
 +}
 +
 +=over
 +
 +=item init
 +
 + method init(String $filename, $options?);
 + method init(Int $fd);
 +
 + # Read
 + $fobj = new IO::File($filename);
 +
 + # Write
 + $fobj = new IO::File($filename, :w);
 +
 + # Read using file descriptor
 + $fobj = new IO::File($fd);
 +
 +Associate an IO object with an already-open file descriptor,
 +presumably passed in from the parent process.
 +
 +=back

Why should this do POSIX? What about non-POSIX operating systems?

Why is that function called init, and not open? That's rather non-intuitive.

This should do IO::Seekable and (to be written) IO::Stattable.

 +=head2 IO::FileSystem
 +
 +This reads directories, worries about ownership and permissions, and the 
 like.
 +
 +class  IO::FileSystem does IO::POSIX does IO::Closeable does IO::Openable {
 +...
 +}

Why should this do POSIX? What about non-POSIX operating systems?

 +=head2 IO::Socket::INET
 +
 +class  IO::Socket::INET does IO::Socket {
 +...
 +}
 +
 +=over
 +
 +=item  init
 +
 + method Bool init($RemoteHost, $RemotePort, $LocalHost?, $LocalPort?);
 +
 +=item open($Listen?);
 +
 +If $Listen is 0, it does a connect().  If $Listen is 1, it does a connect() 
 and a
 +listen().  If $Listen is 2, it does a listen(), but no connect().
 +

I *really* hate that interface, and I don't see how it covers an
accepting socket.

IMO there should be two calls

method IO connect($RemoteHost, $RemotePort, *%options)

where *%options can contain things like the local address,
non-blockingness, etc...

method IO::Accepting listen($LocalHost, $LocalPort, *%options)

role IO::Accepting does IO::Socket {
IO accept();
}

 -=head1 Input and Output
 +=head2 IO::Pipe

 -=over 4
 +class  IO::Pipe does IO::POSIX does IO::Closeable does IO::Openable {
 +...
 +}

Why should this do POSIX? What about non-POSIX operating systems?

Regards,

Leon Timmermans


Re: r25328 - docs/Perl6/Spec

2009-02-14 Thread Leon Timmermans
On Sat, Feb 14, 2009 at 10:31 PM, Brandon S. Allbery KF8NH
allb...@ece.cmu.edu wrote:

 I think the point here is that on POSIX systems that gets you ioctl() and
 fcntl(), and on non-POSIX systems either they don't exist or they throw
 runtime errors.  Aside from my earlier suggestion that non-POSIX systems
 generally have similar functions for which we should consider a common
 rubric, I'm not sure if this (does IO::POSIX) is backwards or if my/our(?)
 understanding of does is backwards, or possibly tangential.


IMO IO::POSIX should do exactly what it says it does: implement POSIX
as closely as possible. Since we probably can't implement much of it
on non-POSIX platforms, I don't think it should be part of our
specification (though I do think it should be part of our
implementation, because it is definitely useful).

I think it would be a lot better to implement a more portable wrapper
around the necessary functionality.

Regards,

Leon


Re: r25172 - docs/Perl6/Spec

2009-02-04 Thread Leon Timmermans
On Tue, Feb 3, 2009 at 8:34 AM, Richard Hainsworth rich...@rusrating.ru wrote:
 I strongly believe the current S16 needs rewriting from scratch. This
 approach seems far more more perl6-ish. I tried to draft a new S16, but
 realised I simply dont have the knowledge (or the time to acquire the
 knowledge) necessary for even an initial draft. But in trying, these are
 some of the ideas I had.

I fully agree.

 c) the file tests :r and :w are not adverbs. They are methods on File
 objects to determine the properties readability and writeability and return
 Booleans. Things which are different should be named differently. Also, in
 my (very limited) experience, testing readability and writeability are less
 frequent in use than opening for read and write, thus for Huffman reasons,
 they should be longer. May be .readable .writeable?

I think what S16 currently proposes is just fine.

 d) The vast majority of S16 seems to be about functions that are essentially
 wrappers around unix calls. To be honest, I have never used most of them
 within a perl program.

Yeah, many of them should be moved to POSIX::, and/or be replaced by
something better.

 When originally developed, it was to fill a need
 directly related to managing unix systems. There are now better tools for
 these tasks, so perl6 does not need to address them in the core.

I'm not sure what you mean with that. I don't think there is any
reason why Perl 6 is inferior to some other tool for managing unix
systems. If it is, we should fix that.

 The success
 of perl on the internet was due to the much deeper design values
 incorporated in perl and that these deeper insights were more adaptable to a
 different environment. There are now a variety of tools for handling the
 internet environment. Perl6 - I believe - is now addressing an even wider
 set of issues - a larger problem space. Leaving unix wrappers in the core
 specifications will tie it down and perhaps hinder its development. Suppose
 perl6 becomes the defacto language for an internet browser, IO would not
 even be related to files or an operating system.)

We have pluggable preludes. We can neutralize that problem easily.

 g) Statbuf is mentioned in S03. It is not really dealt with in S16. It seems
 to me from the context in S03 that Stafbuf is a sort of 'eager'  filehandle,
 in that the whole file is pulled into memory and then can be operated on. If
 this is the case, would it not be more appropriate for the eagerness to be
 defined as an adverb for 'open()' ? eg.
 my $filehandle .= open(name, :r, :e);
 Wouldn't this eliminate the need for Statbuf as a defined object type?


No, it's just the caching result of stat(), that happens to remember
what file/handle is was called on.

It seems S03 and S16 disagree on the meaning of $filename ~~ :e
though. According to S16 it means $filename.:e, according to S03 it
means $filename.e. I think it was discussed some time ago and S16 is
correct.

 h) Would it not be possible to write the IO specification in such a way as
 to make everything 'outside' the program a single category of IO? Thus
 files, http and ftp connections are all streams into containers and the same
 verb ( 'open()' ) with attendant adverbs (:w, :r) are used to establish them
 and the same set of tests (.readable, .writeable) used to verify the steams
 have the required properties at some point in the programe. All directories
 and urls would all be locations with the same methods to discover container
 objects (files, archives, databases) in them.


There's nothing special about IO objects. Nothing is stopping anyone
from writing their own objects implementing the IO roles (in fact,
roles encourage doing just that). I don't understand what's the
question, really.

Though if you mean with open() that is should do what PHP's fopen does
(open anything, from files to http connections and more): absolutely
not. That's the kind of behavior that must be explicit, else we open
up to a whole range of security problems.

Regards,

Leon Timmermans


Re: r25182 - docs/Perl6/Spec

2009-02-04 Thread Leon Timmermans
On Wed, Feb 4, 2009 at 4:37 PM,  pugs-comm...@feather.perl6.nl wrote:
 +=head2 IO
 +
 +The base role only tags that this is an IO object for more generic
 +purposes. It doesn't specify any methods or attributes.
 +

Shouldn't IO::readable and IO::Writable do IO?

 +
 +=head2 IO::Closeable
 +

I still think this should be in a more general namespace than IO.

 +
 +=item method IO dup()
 +

Do we really want that? POSIX' dup does something different from what
many will expect. In particular, the new file descriptors share the
offset, which can result in some really confusing situations.

Leon


Re: r25172 - docs/Perl6/Spec

2009-02-02 Thread Leon Timmermans
On Mon, Feb 2, 2009 at 1:05 PM,  pugs-comm...@feather.perl6.nl wrote:

  =item getc

 -our Bool method getc (IO $self: *...@list)
 +our Bool method getc (IO $self: Bool :async)

getc returning a Bool???

 -the latter case C$! is set).
 +the latter case C$! is set). The C:async flag lets the call
 +return an undefined value if no character is immediately available.


IMHO it would be better to call that non-blocking IO instead of
asynchronous IO, but I'm POSIX-biased.

Regards,

Leon Timmermans


Re: Converting a Perl 5 pseudo-continuation to Perl 6

2009-01-02 Thread Leon Timmermans
When going OO, I'd say an augment()/inner() approach would be
cleanest. See 
http://search.cpan.org/~drolsky/Moose/lib/Moose/Cookbook/Basics/Recipe6.pod
for an example. I don't know how to express that in Perl 6 though.

Regards,

Leon

On Fri, Jan 2, 2009 at 2:08 AM, Steve Lukas lukas...@yahoo.com wrote:
 Hello,
 I'd vote for the OO-style.
 My reason is that the major criteria should be the reader perspective.
 It should be as clear as possible what's going on in the main code
 even if the reader doesn't know the hottest p6 tricks!
 What you are doing here is: two operations on the same thing (the pidfile).
 So the code should point out that it works twice on the same thing.

 I think it's best to have an object to show this
 whereas returning the sub/closure feels a bit confusing.
 Your right, this style is busy work, but it's not pointless.

 I would suggest a locally visible class to bring out the
 local, one time usage of that class. Btw. what is the best way to do so?

 Kind regards
 Stefan


 --- On Thu, 1/1/09, Geoffrey Broadwell ge...@broadwell.org wrote:
 From: Geoffrey Broadwell ge...@broadwell.org
 Subject: Converting a Perl 5 pseudo-continuation to Perl 6
 To: perl6-us...@perl.org, perl6-language@perl.org
 Date: Thursday, January 1, 2009, 3:34 PM

 In the below Perl 5 code, I refactored to pull the two halves of the PID
 file handling out of init_server(), but to do so, I had to return a sub
 from pid_file_handler() that acted as a continuation.  The syntax
 is a
 bit ugly, though.  Is there a cleaner way to this in Perl 6?

 ##
 sub init_server {
my %options  = @_;

# ...

# Do top (pre-daemonize) portion of PID file handling.
my $handler = pid_file_handler($options{pid_file});

# Detach from parent session and get to clean state.
become_daemon();

# Do bottom (post-daemonize) portion of PID file handling.
$handler-();

# ...
 }

 sub pid_file_handler {
# Do top half (pre-daemonize) PID file handling ...
my $filename = shift;
my $basename = lc $BRAND;
my $PID_FILE = $filename || $PID_FILE_DIR/$basename.pid;
my $pid_file = open_pid_file($PID_FILE);

# ... and return a continuation on the bottom half
 (post-daemonize).
return sub {
$MASTER_PID  =  $$;
print $pid_file $$;
close $pid_file;
};
 }
 ##

 When I asked this question on #perl6, pmurias suggested using
 gather/take syntax, but that didn't feel right to me either -- it's
 contrived in a similar way to using a one-off closure.

 pmichaud offered several possibilities (I've converted some of his
 suggestions expressed as prose into code, so the errors there are mine):

 1. Take advantage of Perl 6 syntax reduction to turn 'return sub {...}'
   into 'return {...}' (or even just fall of the end with
 '{...}', I
   suppose).  This is visually slightly better, but still leaves the
   bottom half inside a block that merely exists to satisfy Perl, not
   actually representing anything intrinsic about the problem.

 2. Throw a resumable exception in the middle:

   sub init_server {
   # ...
   pid_file_handler($options{pid_file});
   become_daemon();
   pid_file_handler();
   # ...
   }

   sub pid_file_handler {
   # ... top half ...
   throw ResumableException;
   # ... bottom half ...
   }

   He also suggested a variant syntax with an adverb on return:

   sub pid_file_handler {
   # ... top half ...
   return :resumable;
   # ... bottom half ...
   }

   I suggested a naked yield syntax:

   sub pid_file_handler {
   # ... top half ...
   yield;
   # ... bottom half ...
   }

   These all desugar to the same thing, of course.

 3. Make become_daemon a part of pid_file_handler, or vice-versa.
   I rejected both of these on the basis of separating different
   things into different subs.  The two tasks are only tangentially
   related, and neither really seems like a subordinate op of the
   other.

 4. In order to keep the sub separate, but still not split the
   pid_file_handler call, I came up with a variation of #3 in which
   pid_file_handler takes a callback parameter:

   sub init_server {
   # ...
   pid_file_handler($options{pid_file}, become_daemon);
   # ...
   }

   sub pid_file_handler($pid_file, callback) {
   # ... top half ...
   callback();
   # ... bottom half ...
   }

   That seems like a silly contortion to hide the problem, and
   doesn't represent my intent well -- the pid file handler doesn't
   need to send a message, it needs to yield control while waiting
   for something else to happen.

 5. Make a new PidHandler class and address the problem in OO fashion:

   sub init_server {
   # ...
   my $pid_handler = PidHandler.new(file = $options{pid_file});
   $pid_handler.top();
   become_daemon();
   $pid_handler.bottom();
   #...
   }

   This is certainly workable, but again feels like a contrived
   workaround in 

Re: Converting a Perl 5 pseudo-continuation to Perl 6

2009-01-01 Thread Leon Timmermans
I can't help wondering why does pid_file_handler need to be split up
in the first place? Why wouldn't it be possible to simply call
pid_file_handler after become_daemon?

Regards,

Leon Timmermans

On Thu, Jan 1, 2009 at 10:34 PM, Geoffrey Broadwell ge...@broadwell.org wrote:
 In the below Perl 5 code, I refactored to pull the two halves of the PID
 file handling out of init_server(), but to do so, I had to return a sub
 from pid_file_handler() that acted as a continuation.  The syntax is a
 bit ugly, though.  Is there a cleaner way to this in Perl 6?

 ##
 sub init_server {
my %options  = @_;

# ...

# Do top (pre-daemonize) portion of PID file handling.
my $handler = pid_file_handler($options{pid_file});

# Detach from parent session and get to clean state.
become_daemon();

# Do bottom (post-daemonize) portion of PID file handling.
$handler-();

# ...
 }

 sub pid_file_handler {
# Do top half (pre-daemonize) PID file handling ...
my $filename = shift;
my $basename = lc $BRAND;
my $PID_FILE = $filename || $PID_FILE_DIR/$basename.pid;
my $pid_file = open_pid_file($PID_FILE);

# ... and return a continuation on the bottom half (post-daemonize).
return sub {
$MASTER_PID  =  $$;
print $pid_file $$;
close $pid_file;
};
 }
 ##

 When I asked this question on #perl6, pmurias suggested using
 gather/take syntax, but that didn't feel right to me either -- it's
 contrived in a similar way to using a one-off closure.

 pmichaud offered several possibilities (I've converted some of his
 suggestions expressed as prose into code, so the errors there are mine):

 1. Take advantage of Perl 6 syntax reduction to turn 'return sub {...}'
   into 'return {...}' (or even just fall of the end with '{...}', I
   suppose).  This is visually slightly better, but still leaves the
   bottom half inside a block that merely exists to satisfy Perl, not
   actually representing anything intrinsic about the problem.

 2. Throw a resumable exception in the middle:

   sub init_server {
   # ...
   pid_file_handler($options{pid_file});
   become_daemon();
   pid_file_handler();
   # ...
   }

   sub pid_file_handler {
   # ... top half ...
   throw ResumableException;
   # ... bottom half ...
   }

   He also suggested a variant syntax with an adverb on return:

   sub pid_file_handler {
   # ... top half ...
   return :resumable;
   # ... bottom half ...
   }

   I suggested a naked yield syntax:

   sub pid_file_handler {
   # ... top half ...
   yield;
   # ... bottom half ...
   }

   These all desugar to the same thing, of course.

 3. Make become_daemon a part of pid_file_handler, or vice-versa.
   I rejected both of these on the basis of separating different
   things into different subs.  The two tasks are only tangentially
   related, and neither really seems like a subordinate op of the
   other.

 4. In order to keep the sub separate, but still not split the
   pid_file_handler call, I came up with a variation of #3 in which
   pid_file_handler takes a callback parameter:

   sub init_server {
   # ...
   pid_file_handler($options{pid_file}, become_daemon);
   # ...
   }

   sub pid_file_handler($pid_file, callback) {
   # ... top half ...
   callback();
   # ... bottom half ...
   }

   That seems like a silly contortion to hide the problem, and
   doesn't represent my intent well -- the pid file handler doesn't
   need to send a message, it needs to yield control while waiting
   for something else to happen.

 5. Make a new PidHandler class and address the problem in OO fashion:

   sub init_server {
   # ...
   my $pid_handler = PidHandler.new(file = $options{pid_file});
   $pid_handler.top();
   become_daemon();
   $pid_handler.bottom();
   #...
   }

   This is certainly workable, but again feels like a contrived
   workaround in the same way that gather/take and return {...} do.
   Plus, writing a new class and using OO/method call syntax just to
   allow a sub to be split seems like pointless busy work.  Not
   as bad in Perl 6 as in Perl 5, but still.

 In the end, I think I like the 'naked yield' idea best of the ones we
 have so far.  Any comments or other ideas? [1]


 -'f

 [1] Other than that I've used the word 'contrived' too many times.  :-)





Re: Working with files wish list

2008-12-16 Thread Leon Timmermans
On Tue, Dec 16, 2008 at 7:04 AM, jason switzer jswit...@gmail.com wrote:
 I hadn't seen a Nameable role mentioned yet, so I wasn't able to understand
 any such concept.

The list was not meant to be exhaustive. There are a lot more roles
that have something to do with IO but were missing: Asynchronous IO,
Datagram sockets, and more (specially when you add in platform
specific stuff). The whole idea is that almost any operation you can
do on one kind of handle can be done on some other kind too. There is
a lot of overlap between seemingly unrelated types of handles. In this
case, files and unix domain sockets are created and used in rather
different ways, but both have a place in the filesystem, so it would
be appropriate that they share the interface for retrieving that
location.

 That is a good idea, but the idea is so general that
 anything can be nameable and thus the specificity of the role could quickly
 become lost. I was suggesting specific naming functionalities be added to
 the File role. If you want to abstract that, that's fine, but beware that
 something like Nameable can be too broad of a role (maybe just IONameable?).

I agree Nameable isn't the best name. How about Locatable? Having said
that, I suppose a generic Nameable role providing a human readable
designation to a handle (as opposed to one for computers) would be
useful too, if only for error messages.

 I haven't spent the time to understand mix-ins yet, but this does look like
 a feasible (clean) idea. However, how do you specify one/more filters? For
 example, say you want to :rw a file. How can you provide an input filter and
 an output filter (or multiples of either)? Can you layer filters if done
 with mix-ins?

Stacking can be done:

$fstab does WhitespaceTrim does TranslateKlingon;

I'm not sure if this is the best way to approach the problem though.
This is a power drill, a screwdriver will also do in many cases.

 If so, how do you specify direction?

That would be a problem with this approach. You'd probably need
separate roles for readers and writers.


Regards,

Leon Timmermans


Re: Working with files wish list

2008-12-15 Thread Leon Timmermans
 be the stringified .name attribute of the files.

 No need to opendir or readdir. Lazy evaluation could handle most situations,
 but where the Location could be constantly changing its contents, a
 $dir.refresh() method might suffice.

I agree there should be a single function that combines opendir,
readdir and closedir. Scalar readdir can be useful in some context,
but in my experience it's the less common usage of it. From a
programmers point of view lazy operation would be convenient, but from
a resource management point of view that may be a bit complicated.

 f) In general on directories, I am sure a variety of solutions could be
 conceived. It seems to me that abstractly any form of directory could be
 thought of as a Location, which has some path defined for it (though the
 syntax of the path is OS dependent), and which might have children
 locations. At a minimum, a Location would need to provide information about
 whether new resources could be created or accessed (eg., read / write
 permissions).

 There are various paradigms for defining how to traverse networks. At some
 point, our language legislators will need to define one for perl6.

 If the name of the location node, which can be exposed to the user, eg., by
 printing it or showing it in a GUI to be clicked on, is separated from the
 OS/locale-dependent underlying_name (which may not be easily displayed on a
 standard GUI – suppose it is in ancient Buriyat), then identifying nodes and
 traversing a network of nodes could be made abstract enough to handle all
 sorts of environments.

 Perhaps, too a module for a specific environment, eg., Windows, would
 provide the syntatic sugar that makes specifying a location look like
 specifying a directory natively, eg.
 use IO::Windows;
 my Location $x .= new(:OSpathC:\\Documents\perldata\);
 whilst for linux it would be
 use IO::Linux;
 my Location $x .=new(:OSpath/home/perldata/);

 This started as short wish list and got far too long. Sorry


I think a File::Spec-like approach would be better.



Regards,

Leon Timmermans


Re: Working with files wish list

2008-12-15 Thread Leon Timmermans
On Mon, Dec 15, 2008 at 6:42 PM, jason switzer jswit...@gmail.com wrote:
 It's lazy and kinda cheating, but for small simple tasks, it gets the job
 done. I'm not up to speed with the IO spec, but a sort of auto-slurp
 functionality would be nice. Something to the effect:

 @data = :slurp(mydatafile.txt);

A slurp() function has been specced to slurp a file into a string, as
well as a lines() function that does the same into an array of lines.

 I think File::Path::canonpath and File::Path::path would be
 nice attributes to add to the File role.

You didn't get the point of my Roles idea. It should not be added to a
role File, but to the Role Nameable, which would be composed into
whatever implements file filehandles, but for example also into Unix
sockets. IMNSHO interfaces and implementation should be kept separate
to maintain a proper abstraction level.

 I would imagine a filter role would be useful. If they're roles, it allows
 people to build layers of functionality on them to do various different
 kinds of filters, turn them on and off, etc. With filters as roles, I would
 love to imagine something like this:

 my File $fstab = new(:name/etc/fstab, :filternew WhitespaceTrim)


You can already easily mix it in using 'does':

$fstab = open('/etc/fstab', :r);
$fstab does WhitespaceTrim;

I don't think it's really necessary to include that into open(),
though it might be useful syntactic sugar.


Regards,

Leon Timmermans


Re: Resume from exception

2008-12-15 Thread Leon Timmermans
On Mon, Dec 15, 2008 at 8:47 PM, Stephen Weeks t...@allalone.org wrote:
 do {
die 'some text';
say 'after the exception';
CATCH {
say 'caught the exception';
...; # what goes here?
}
 }

 My proposal is to call .resume() on the exception object.

 Thoughts?


The spec says Exceptions are not resumable in Perl 6 unless the
exception object does the Resumable role.. I don't think Str does
Resumable. In other words, you can't resume that.

Otherwise, I agree resume is a logical name.

Regards,

Leon


Re: Roles and IO?

2008-12-12 Thread Leon Timmermans
On Fri, Dec 12, 2008 at 3:04 AM, Jon Lang datawea...@gmail.com wrote:
 One of the things about roles is that once you have composed a bunch
 of them into another role, they're considered to be composed into
 whatever that role is composed into.  So does File would be
 equivalent to does Mappable does Pollable does Statable does Ownable
 (barring potential conflicts between Mappable, Pollable, Statable, and
 Ownable which File would presumably resolve).

I assumed a new role makes a new interface. In other words, that a
type that happens to do Pollable, Mappable, Statable and Ownable
wouldn't automatically do File in that case. If I was wrong my abuse
of subset wouldn't be necessary. Otherwise, maybe there should be a
clean way to do that. Now I'm thinking of it, wouldn't something like

our ::File = Mapable  Pollable  Statable  Ownable;

do the trick?

On Fri, Dec 12, 2008 at 3:52 AM, Mark J. Reed markjr...@gmail.com wrote:
 As Jonathan said, I think composition makes more sense here... but what if
 you have an interface that expects an IO object and does nothing with it but
 pass it into some other interface?  How does it declare that?  It seems like
 there still needs to be a generic superrole that means some non-empty but
 unspecified subset of these roles - maybe Closable would work, but it's
 not real clear.

Yeah, I wasn't clear on that, but I agree there should be some base
role shared by all these roles, though I'm wondering if that should be
shared by all handles or just IO handles. I see no reason why
Closable should be limited to IO handles, but I do see a use for
being able to indicate you're talking about an IO handle. I'd say it
makes sense to define IO as Readable | Writable.

On Fri, Dec 12, 2008 at 9:23 AM, Dmitry Karasik dmi...@karasik.eu.org wrote:
 Wouldn't the proposed solution raise an error if an unsupported role
 method is tried? It's not that the proposed solution is inappropriate,
 but the problem that I think you're trying to solve won't be solved
 by it.


In the worst case scenario, you're right. However if you use the roles
properly this shouldn't happen because you'd get an error much sooner.
If your interface expects a Seekable and you pass it a pipe, it will
immediately raise an error, instead of waiting until you try to use
it.

Regards,

Leon


Roles and IO?

2008-12-11 Thread Leon Timmermans
Hi all,

I've been thinking about how the IO interface should be organized in
perl6. It seems that part of S16 has received little attention so far.

One main problem with filehandles is that are rather diverse. The only
operation that all of them have in common is close. Reading versus
writing is a obvious difference, there are many more differences. One
can't seek a socket or a pipe, and likewise one can't accept on a
file. A listening socket can't even be read or written to. At the same
time, they all do have some parts in common with some other types of
handles.

Perl 5's solution is to use a fat interface, and raise an error if an
unsupported action is tried. I think that approach is needlessly
fragile. Another solution is to make a separate class for every
variety of handle, but IMO that's a plain fugly solution that simply
doesn't scale up very well.

What I propose is using role composition for *everything*. Most
importantly that includes the roles Readable and Writable, but also
things like Seekable, Mapable, Pollable, Statable, Ownable, Buffered
(does Readable), Socket, Acceptable (does Pollable), and more.

That may however make some interfaces is a bit wordy. I think that can
be conveyed using a subset like this (though that may be abusing the
feature).

subset File of Mapable  Pollable  Statable  Ownable;

In this case, these calls:

open($filename, :w);

would return a Writable  File, and

Socket::connect($remote_host, $port, :typeinet);

would return a Socket  Buffered  Pollable  Writable


Regards,

Leon Timmermans


Re: Files, Directories, Resources, Operating Systems

2008-12-08 Thread Leon Timmermans
On Mon, Dec 8, 2008 at 8:16 PM, Aristotle Pagaltzis [EMAIL PROTECTED] wrote:
 It looks like Python 3000 just tried that.

 People are not happy about it:
 http://utcc.utoronto.ca/~cks/space/blog/python/OsListdirProblem


Yeeh, I also noted exactly that problem when reading the What's New
In Python 3.0. What were they thinking?!

Leon


Re: how to write literals of some Perl 6 types?

2008-12-04 Thread Leon Timmermans
On Thu, Dec 4, 2008 at 6:34 PM, TSa [EMAIL PROTECTED] wrote:
 HaloO,

 And how about 'Num 1.0 === Complex(1,0) === Int 1'? Should all these
 be identical irrespective the fact that they come from three different
 type domains? How is that implemented?


IMHO the spec on === is quite clear: two values are never equivalent
unless they are of exactly the same type. IMHO, you shouldn't be
using === but == anyway when doing that kind of numerical work. That
one should DWIM.

Regards,

Leon Timmermans


Re: Files, Directories, Resources, Operating Systems

2008-11-26 Thread Leon Timmermans
On Wed, Nov 26, 2008 at 12:40 PM, Mark Overmeer [EMAIL PROTECTED] wrote:
 Also, I get data from a CD which was written case-insensitive and then
 copied to my Linux box.  It would be nice to be able to say: treat this
 directory case insensitive (even when the implementation is slow)
 Shared with Windows default behavioral interface.


That is a task for the operating system, not Perl. You're trying to
solve the problem at the wrong end here IMHO.

 For instance, you do not know in which character-set the filename is;
 that is file-system dependent.  So, we treat filenames as raw bytes.

On native file-system types (like ext3fs), character-set is not
file-system dependent but non-existent. It really is raw bytes.

 This does cause dangers (a UTF-8 codepoint in the filename with a \x2F
 ('/') byte in it, for instance)

A \x2F always means a '/'. UTF-8 was designed to be backwards
compatible like that.

Regards,

Leon Timmermans


Re: Files, Directories, Resources, Operating Systems

2008-11-26 Thread Leon Timmermans
On Wed, Nov 26, 2008 at 5:15 PM, Mark Overmeer [EMAIL PROTECTED] wrote:
 Yes, you are right on this.  ASCII does not suffer from UTF-8, so my
 example was flawed.  The second 128 does cause problems.  How can glob()
 sort filenames, for instance?

That's a matter of collation, not (just) character set. TIMTOWTDI.
There is no right way to do it as it depends on the circumstances, but
a simple binary sort is not a bad default.

Leon Timmermans


Re: Collapsing Junction states?

2008-11-13 Thread Leon Timmermans
On Thu, Nov 13, 2008 at 2:24 PM, TSa [EMAIL PROTECTED] wrote:
 Do I understand your question right, that you want the return
 of == to be false because there is a one(1,0,1) junction? As
 Duncan points out junctions are immutable values and as such
 the % autothreads but the resulting values are assembled into
 a new junction according to the general rules, i.e. one(0,1).
 The number of elements in one(1,2,3) is not preserved.


But of what use would one() if it were to use those semantics? It
would be essentially the same as any(), and it would definitely not
DWIM.

Regards,


Re: Collapsing Junction states?

2008-11-13 Thread Leon Timmermans
 According to Synopsis 2, under Immutable types, a Junction is a Set with
 additional behaviors.  This implies to me a Junction consists just of
 distinct unordered values.  A Junction is not a Bag and it doesn't matter
 that we lose the fact that a value occurred more than once in the arguments
 of the Junction constructor.  Whether values are considered identical or not
 and get eliminated depends on what their .WHERE returns.  Whether a Perl 6
 implementation internally reduces the constructor value list doesn't matter
 as long as the semantics of using the Junction are as if it had; so eg that
 reduction could be done lazily, just when the Junction is first used. --


Still that doesn't solve the problem of his code example. If my
understanding of the synopses is correct, operations on junctions
generate a new junction, so `one(1,2,3) % 2 == 1` will collapse to
one(1 % 2 == 1, 2 % 2 == 1, 3 % 2 == 1), which is one(true, false,
true). If it collapses, it will be one(true, false), and thus true,
but if it doesn't collapse it will be false.

Either I'm missing something, or the behavior of `one' needs to be
specified more thoroughly. I think I agree with Patrick that collapse
needs to be delayed there.

Regards,

Leon