Nitpick my Perl6 - parametric roles

2006-09-25 Thread Sam Vilain
Anyone care to pick holes in this little expression of some Perl 6 core
types as collections?  I mean, other than missing methods ;)

  role Collection[\$types] {
   has Seq[$types] @.members;
  }
 
  role Set[::T = Item] does Collection[T] where {
  all(.members) =:= one(.members);
  };
 
  role Pair[::K = Item, ::V = Item] does Seq[K,V] {
  method key of K { .[0] }
  method value of V { .[1] }
  };
 
  role Mapping[::K = Item, ::V = Item] does Collection[Pair[K,V]] {
  all(.members).does(Pair) and
  all(.members).key =:= one(.members).key;
  }
 
  role Hash[Str ::K, ::V = Item] does Mapping[K, V]
  where { all(.members).key == one(.members).key }
  {
  method post_circumfix:{ } (K $key) of V|Undefined {
  my $seq = first { .key == $key } .members;
  $seq ?? $seq.value :: undef;
  }
  }
 
  role ArrayItem[::V = Item] does Seq[Int, V] {
  method index of Int { .[0] }
  method value of Item { .[1] }
  };
 
  role Array of Collection[ArrayItem]
  where { all(.members).index == one(.members).index }
  {
  method post_circumfix:[ ] (Int $index) of Item {
  my $seq = first { .index == $index } .members;
  $seq ?? $seq.value :: undef;
  }
  }

I'll take the feedback I get, and try to make a set of Perl 6 classes in
the pugs project that look and feel just like regular Perl 6 hash/arrays
but are expressed in more elementary particles.

Cheers,
Sam.


Re: postgres interface

2006-09-25 Thread Leopold Toetsch
Am Montag, 25. September 2006 00:01 schrieb Bob Rogers:
 It turns out that if libpq.so doesn't exist, pg.t makes t/harness give
 up completely:

Yep.

 I managed to get it to fail less hard (see patch):

Thanks, applied.

 But, as you can see, the continuation barrier gets in the way of the
 error handling.

Exceptions shouldn't be a problem as long as the handler doesn't try to resume 
execution in a different run loop.

leo


Re: [TODO] fill Parrot_register_move() with code : new implementation

2006-09-25 Thread Leopold Toetsch
Am Montag, 25. September 2006 00:06 schrieb Karl Forner:
 On 9/15/06, Leopold Toetsch [EMAIL PROTECTED] wrote:
  - There are 2 use cases for register_move
a) optimized recursive tail calls
b) simple function call argument passing compiled to native code in JIT
  core

 So in that case ( a or b ?), the src_regs are always (0,1,2,..,n) ?
 If so I'm sure that we can use this property to optimize the code.

b) isn't yet using Parrot_register_move(). Therefore it isn't given that 
src_regs are always register positions.

 The problem is that I have no clue of JIT, registers and so on. But could
 you give an example of code that would
 lead to that case ?

Let's forget that case.
JIT code is only created for simple and matching arguments.

  Again, we have to check if any argument conversions could take place and
  then
  turn off the optimization in case.

 ok, so where would the check take place ?
 I can imagine  an extra argument indicating whether or not doing this extra
 optimization, or two different functions/implementations,
 or more infomration about the registers  allowing the function to decide by
 itself to do or not the optimization on a register-couple basis 

No. There have to be an extra check before tailcall optimization is done. When 
there's argument conversion, which involves P registers, 
Parrot_register_move() will not be used at all.

 So is there anything more I could do on this subject ?

Well, you could have a look at recursive_tail_call() in compilers/imcc/pcc.c 
and improve the checks, if the tailcall can be optimized.

 Karl

leo


[perl #40410] Segfault in packfile code

2006-09-25 Thread via RT
# New Ticket Created by  Jonathan Worthington 
# Please include the string:  [perl #40410]
# in the subject line of all future correspondence about this issue. 
# URL: http://rt.perl.org/rt3/Ticket/Display.html?id=40410 


Hi,

Parrot segfaults while generating a packfile for a (large) chunk of 
compiled PIR generated by the .Net translator. You'll need a copy of 
Mono installed to replicate it, I'm too tired to track this down any 
further tonight.

(gdb) r net2pbc.pbc -f  -o mscorlib.pbc /usr/lib/mono/1.0/mscorlib.dll
Starting program: /home/default/jnthn.net/dev/parrot/parrot net2pbc.pbc 
-f  -o mscorlib.pbc /usr/lib/mono/1.0/mscorlib.dll
Reading symbols from shared object read from target memory...done.
Loaded system supplied DSO at 0x55e000
[Thread debugging using libthread_db enabled]
[New Thread -1208564032 (LWP 9073)]
[New Thread -1208702048 (LWP 9076)]
[New Thread -1219191904 (LWP 9077)]
Translated 744 types out of 1365 from /usr/lib/mono/1.0/mscorlib.dll

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1208564032 (LWP 9073)]
0x00cea077 in PF_store_string (cursor=0xb2a18bd0, s=0xb69d0788)
at src/packfile/pf_items.c:565
565 *cursor++ = PObj_get_FLAGS(s); /* only constant_FLAG and 
private7 */
(gdb) bt
#0  0x00cea077 in PF_store_string (cursor=0xb2a18bd0, s=0xb69d0788)
at src/packfile/pf_items.c:565
#1  0x00cb7819 in PackFile_Constant_pack (interpreter=0x83da008,
self=0xa2a8458, cursor=0xb2a18bd0) at src/packout.c:249
#2  0x00cb7669 in PackFile_ConstTable_pack (interpreter=0x83da008,
seg=0x88b7c98, cursor=0xb2a18bcc) at src/packout.c:169
#3  0x00c5f328 in PackFile_Segment_pack (interpreter=0x83da008,
self=0x88b7c98, cursor=0xb28ab450) at src/packfile.c:1302
#4  0x00c5fe62 in directory_pack (interpreter=0x83da008, self=0xa84b8d0,
cursor=0xb28ab440) at src/packfile.c:1697
#5  0x00c5f328 in PackFile_Segment_pack (interpreter=0x83da008,
self=0xa84b8d0, cursor=0xb2793ba0) at src/packfile.c:1302
#6  0x00cb753a in PackFile_pack (interpreter=0x83da008, self=0xa84b8d0,
cursor=0xb2793b90) at src/packout.c:105
#7  0x00d1969c in Parrot_Eval_get_string (interpreter=0x83da008,
pmc=0xb65fac14) at src/pmc/eval.pmc:250
#8  0x00b778f0 in Parrot_print_p_p (cur_opcode=0xb6ae7348,
interpreter=0x83da008) at src/ops/io.ops:339
#9  0x00c687eb in runops_slow_core (interpreter=0x83da008, pc=0xb6ae7348)
at src/runops_cores.c:184
#10 0x00c546d8 in runops_int (interpreter=0x83da008, offset=317)
at src/interpreter.c:775
#11 0x00c5932e in runops (interpreter=0x83da008, offs=3) at 
src/inter_run.c:87
---Type return to continue, or q return to quit---
#12 0x00c59584 in runops_args (interpreter=0x83da008, sub=0x855ffd0,
obj=0x841bab0, meth=0x0, sig=0xdad996 vP,
ap=0xbfc771fc ¨çZ\bØrÇ¿Ðj\032) at src/inter_run.c:193
#13 0x00c59698 in Parrot_runops_fromc_args (interpreter=0x83da008,
sub=0x855ffd0, sig=0xdad996 vP) at src/inter_run.c:287
#14 0x00cb6f5e in Parrot_runcode (interpreter=0x83da008, argc=5,
argv=0xbfc77378) at src/embed.c:806
#15 0x0804afaf in main (argc=5, argv=0xbfc77378) at 
compilers/imcc/main.c:731

Jonathan


Parrot Bug Summary

2006-09-25 Thread Parrot Bug Summary
Parrot Bug Summary

http://rt.perl.org/rt3/NoAuth/parrot/Overview.html
Generated at Mon Sep 25 13:15:02 2006 GMT
---

  * Numbers
  * New Issues
  * Overview of Open Issues
  * Ticket Status By Version
  * Requestors with most open tickets

---

Numbers

Ticket Counts: 89 new + 268 open = 357
Created this week: 18
Closed this week: 13

---

New Issues

New issues that have not been responded to yet

1 - 2 weeks old
40347 Can't determine revision under Subversion 1.4.0
2 - 3 weeks old
40313 [TODO] Tcl - full namespace support
40312 [TODO] Tcl - support namespaces in [info commands]
3 - 4 weeks old
4 - 5 weeks old
40217 Parrot_autoload_class() knows about Python and Tcl
5 - 6 weeks old
40191 [PATCH] PGE simple grammar test file revisited
40182 [TODO] Convert PGE::CodeString to .pmc
40156 [TODO] - Can't use an Iterator with a DynLexPad PMC
40153 [CAGE] TEST_PROG
40151 [TODO] Remove set_pmc vtable method
6 - 7 weeks old
40138 [TODO] Tcl - add tcl's tests into our repository
40132 [TODO] Remove set_pmc vtable method
40124 [TODO] Document HLL mappings
40123 [TODO] push_eh + .param for argument mismatch errors
40106 [PATCH] 15 more tests work for PGE::P5Regex
7 - 8 weeks old
40090 [TODO] Tcl - make 'tcl.pbc --pir' work.
40072 [CAGE] tools/dev/mk_manifest_and_skip.pl requires svn
40066 rewrite ResizeableBooleanArray
40060 [CAGE] Fix non-symbol-table namespace pollution in public headers
40059 [CAGE] Fix symbol table namespace pollution
40053 Empty PGE rule causes error. rule x { }
8 - 9 weeks old
40010 [TODO] Add a mutex to eval_nr in compilers/imcc/parser_util.c
39992 [TODO] t/op/01-parse_ops.t: figure out how to test parsing of pmc
  constant parameters
39939 [TODO] exhaustively test new {set,get}*global and get*namespace opcodes
39932 [TODO] enable bulk operations in rt
39927 [TODO] named/slurpy parameters for PMC methods
9 - 10 weeks old
39913 [BUG] TGE - Can't use } in the transform definitions.
39908 [BUG] IMCC treats $S as a non-register instead of throwing an error
39855 [CAGE] configuration: define MIN/MAX macros for all integral typedefs
10 - 11 weeks old
39852 [TODO] Tcl - Create the ::tcl namespace properly
39851 [BUG] .HLL doesn't reset the .namespace
39845 [TODO] Better IMCC Errors: unexpected IDENTIFIER
39844 [BUG] Parrot doesn't do args checking for a sub without params
39833 [TODO] Tcl - Make [rename] handle namespaces
39827 [TODO] [CAGE] implement is_abs_path()
39824 [CAGE] tools/dev/check_source_standards.pl -- this should be a test
39802 [PATCH] [CAGE] turning up the warnings levels in gcc as much as we can
39784 Make Parrot's default namespace be untyped
11 - 12 weeks old
39738 bind fails with errno EADDRNOTAVAIL on darwin and FreeBSD
12 - 13 weeks old
39648 PGE - bad variable name
13 - 14 weeks old
14 - 15 weeks old
39430 Method cache not always invalidated
15 - 16 weeks old
39329 Check to make sure PMC_str_val, etc. are used appropriately
16 - 17 weeks old
17 - 18 weeks old
39197 [CAGE] lib/Parrot/Test.pm ignores core dumps failures!
18 - 19 weeks old
19 - 20 weeks old
20 - 21 weeks old
39051 Test failure in t/pmc/objects_62.pasm (attributes)
---

Overview of Open Issues

Platform   Severity   Tag  Lang
aix   0abandoned 05005threads   0  Amber0
All   2fatal 3bounce0  BASIC0
bsdos 0High  0Bug  29  bc   0
cygwin0low   1compiler  0  befunge  0
cygwin_nt 0medium0configure 0  bf   0
darwin0none  0core  0  cola 0
dec_osf   0Normal1dailybuild0  forth0
dgux  0unknown   0docs  0  jako 0
dos   0Wishlist  3duplicate 0  Lisp 0
dynixptx  0  install   1  m4   0
freebsd   0   library   0  ook  0
generic   0   notabug   0  perl60
gnu   0   notok 0  plot 0
HPUX  0   ok0  punie1
irix  0   Patch23  python   0
irix640   regex 0  ruby 0
Linux 1   sendToCPAN0  scheme   0
lynxos0   Todo196  tcl 30
mac   0   unknown   0  urm  0
machten   0   utilities 0  Zcode0

Re: Nitpick my Perl6 - parametric roles

2006-09-25 Thread TSa

HaloO,

Sam Vilain wrote:

Anyone care to pick holes in this little expression of some Perl 6 core
types as collections?  I mean, other than missing methods ;)


My comments follow.



  role Collection[\$types] {
   has Seq[$types] @.members;
  }


This is a little wrapper that ensures that collections have got
a @.members sequence of arbitrary type. This immediately raises
the question how Seq is defined.



  role Set[::T = Item] does Collection[T] where {
  all(.members) =:= one(.members);
  };


Nice usage of junctions! But how is the assertion of
uniqueness transported into methods that handle adding
of new values? In other words: I doubt that this comes
freely out of the type systems inner workings but is
more a statement of the intentions of a Set. Which leads
to the question when this where clause will be checked
or used to base MMD decisions.



  role Pair[::K = Item, ::V = Item] does Seq[K,V] {
  method key of K { .[0] }
  method value of V { .[1] }
  };
 
  role Mapping[::K = Item, ::V = Item] does Collection[Pair[K,V]] {

  all(.members).does(Pair) and
  all(.members).key =:= one(.members).key;
  }


I guess this is a typo and you wanted a where clause. The first
assertion of the members doing the Pair role should be guaranteed
by using Pair as the type argument when instantiating the Collection
role. Are you sure that the underlying Seq type handles the one and
two parameter forms you've used so far?



  role Hash[Str ::K, ::V = Item] does Mapping[K, V]


Will the Str assertion not be too specific for non-string hashes?


  where { all(.members).key == one(.members).key }
  {
  method post_circumfix:{ } (K $key) of V|Undefined {


Nice union type as return type. But isn't the type name Undef?


  my $seq = first { .key == $key } .members;


Wasn't that @.members?


  $seq ?? $seq.value :: undef;


Ternary is spelled ?? !! now.



  }
  }
 
  role ArrayItem[::V = Item] does Seq[Int, V] {

  method index of Int { .[0] }
  method value of Item { .[1] }
  };


Here we see the two parameter version of Seq at work.



  role Array of Collection[ArrayItem]
  where { all(.members).index == one(.members).index }
  {
  method post_circumfix:[ ] (Int $index) of Item {
  my $seq = first { .index == $index } .members;


Is this first there a grep-like function? Shouldn't it then
read 'first { .index == $index }, @.members'?



  $seq ?? $seq.value :: undef;
  }
  }

I'll take the feedback I get, and try to make a set of Perl 6 classes in
the pugs project that look and feel just like regular Perl 6 hash/arrays
but are expressed in more elementary particles.


This might be very useful in future debates about these types. But
I think everything hinges on the basic Seq type.


Regards, TSa.
--


Re: Nitpick my Perl6 - parametric roles

2006-09-25 Thread Miroslav Silovic

TSa wrote:


   role Set[::T = Item] does Collection[T] where {
   all(.members) =:= one(.members);
   };

Nice usage of junctions!



But buggy - one means *exactly* one. So for an array of more than 1 
element, all(@array) never equals one(@array) - if they're all the same, 
it's more than 1, otherwise it's 0.


all(.members) =:= any(.members) would also not work, as it will try to 
match each member with some other or same member of the array. It will 
always return true, in other words, as each element of the array is 
equal to itself.


This leaves all(.members) =:= .members[0], possibly extra with 
non-emptiness test.


   Miro




Re: Nitpick my Perl6 - parametric roles

2006-09-25 Thread TSa

HaloO,

Miroslav Silovic wrote:

TSa wrote:

Nice usage of junctions!



But buggy - one means *exactly* one. So for an array of more than 1 
element, all(@array) never equals one(@array) - if they're all the same, 
it's more than 1, otherwise it's 0.


Doesn't all(1,2,3) == one(1,2,3) expand the all junction first?
So that we end up with 1 == one(1,2,3)  2 == one(1,2,3)
 3 == one(1,2,3) which is true. In the case of duplicated
entries we get a false if the one-junction supports that.
That is, how does e.g. one(1,1,2) work? Is it failing for 1?

Regards,
--


Mutability vs Laziness

2006-09-25 Thread Aaron Sherman

Carried over form IRC to placeholder the conversation as I saw it:

We define the following in S06 as immutable types:

ListLazy Perl list (composed of Seq and Range parts)
Seq Completely evaluated (hence immutable) sequence
Range   Incrementally generated (hence lazy) sequence
Set Unordered Seqs that allow no duplicates
JunctionSets with additional behaviours
PairSeq of two elements that serves as a one-element Mapping
Mapping Pairs with no duplicate keys

It seems to me that there are three core attributes, each of which has 
two states:


Mutability: true, false
Laziness: true, false
Ordered: true, false

There are, thus, eight types of containers, but two (unordered, mutable, 
lazy/eager) don't really work very well, so let's say 6:


Ordered,   Immutable, Eager:  Seq
Ordered,   Immutable, Lazy:   Range and/or Seq of Range?
Ordered,   Mutable,   Eager:  ?
Ordered,   Mutable,   Lazy:   Array
Unordered, Immutable, Eager:  Set
Unordered, Immutable, Lazy:   x and/or Set of x?

In that last example, x is an unordered range, though we don't have 
such a type. Basically, this is something like any(a..b).


The real question in my mind, though is this: do we need to call 
something Lazy (as we currently do in S29), or should we just call it 
List or Array depending on its mutability?





[svn:perl6-synopsis] r12398 - doc/trunk/design/syn

2006-09-25 Thread larry
Author: larry
Date: Mon Sep 25 10:13:23 2006
New Revision: 12398

Modified:
   doc/trunk/design/syn/S02.pod
   doc/trunk/design/syn/S03.pod
   doc/trunk/design/syn/S06.pod

Log:
Slaughter of special [,], now is just listop form of [...]
To support |func() syntax, | is the new * (desigilized)


Modified: doc/trunk/design/syn/S02.pod
==
--- doc/trunk/design/syn/S02.pod(original)
+++ doc/trunk/design/syn/S02.podMon Sep 25 10:13:23 2006
@@ -12,9 +12,9 @@
 
   Maintainer: Larry Wall [EMAIL PROTECTED]
   Date: 10 Aug 2004
-  Last Modified: 22 Sept 2006
+  Last Modified: 25 Sept 2006
   Number: 2
-  Version: 71
+  Version: 72
 
 This document summarizes Apocalypse 2, which covers small-scale
 lexical items and typological issues.  (These Synopses also contain
@@ -670,7 +670,6 @@
 @   ordered array
 %   unordered hash (associative array)
code/rule/token/regex
-|   capture/arguments/match
 ::  package/module/class/role/subset/enum/type/grammar
 @@  multislice view of @
 
@@ -818,22 +817,14 @@
 $$args; # same as $args as Scalar or Scalar($args)
 @$args; # same as $args as Array  or Array($args)
 %$args; # same as $args as Hash   or Hash($args)
-|$args; # all of the above
 
 When cast into an array, you can access all the positional arguments; into a
 hash, all named arguments; into a scalar, its invocant.
 
-When stored in a variable using the C| sigil, the capture autointerpolates
-into argument lists much like C@ autoflattens into lists:
-
-|args := \($a, @b, :option($c));
-somefunc(|args);   # same as somefunc($a, @b, :option($c))
-
 All prefix sigil operators accept one positional argument, evaluated in
 scalar context as a rvalue.  They can interpolate in strings if called with
 parentheses.  The special syntax form C$() translates into C$( $/ ) 
-to operate on the current match object; the same applies to C@(), C%() and
-C|() forms.
+to operate on the current match object; the same applies to C@() and C%().
 
 CCapture objects fill the ecological niche of references in Perl 6.
 You can think of them as fat references, that is, references that
@@ -2153,9 +2144,10 @@
 
 =item *
 
-The C[,] list operator may be used to force list context on its
+The C| prefix operator may be used to force capture context on its
 argument and Ialso defeat any scalar argument checking imposed by
-subroutine signature declarations.  This list flattens lazily.
+subroutine signature declarations.  Any resulting list arguments are
+then evaluated lazily.
 
 =item *
 

Modified: doc/trunk/design/syn/S03.pod
==
--- doc/trunk/design/syn/S03.pod(original)
+++ doc/trunk/design/syn/S03.podMon Sep 25 10:13:23 2006
@@ -12,7 +12,7 @@
 
   Maintainer: Larry Wall [EMAIL PROTECTED]
   Date: 8 Mar 2004
-  Last Modified: 23 Sept 2006
+  Last Modified: 25 Sept 2006
   Number: 3
   Version: 68
 
@@ -64,9 +64,8 @@
 =item * Unary C~ now imposes a string (CStr) context on its
 argument, and C+ imposes a numeric (CNum) context (as opposed
 to being a no-op in Perl 5).  Along the same lines, C? imposes
-a boolean (CBool) context, and the C[,] list operator imposes
-a function-arguments (CCapture) context on its arguments (as does
-the C| sigil when used as an operator).
+a boolean (CBool) context, and the C| unary operator imposes
+a function-arguments (CCapture) context on its argument.
 Unary sigils impose the container context implied by their sigil.
 As with Perl 5, however, C$$foo[bar] parses as C( $($foo) )[bar],
 so you need C$($foo[bar]) to mean the other way.
@@ -906,14 +905,11 @@
 return a boolean for either 1 or 0 arguments.  Negated operators
 return CBool::False, and all the rest return CBool::True.
 
-You can also make a reduce operator of the comma operator.  This has
-the effect of dereferencing its arguments into another argument list
-as if they'd been placed there directly.
+You can also make a reduce operator of the comma operator.  This is just
+the list operator form of the C circumfix:[ ]  anonymous array composer:
 
-@args = [EMAIL PROTECTED],1,2,3;
-push [,] @args;# same as push(@foo: 1,2,3)
-
-See S06 for more.
+[1,2,3]# make new Array: 1,2,3
+[,] 1,2,3  # same thing
 
 You may also reduce using the semicolon second-dimension separator:
 
@@ -968,7 +964,7 @@
 [^^]()  # Bool::False
 [//]()  # undef
 [=]()   # undef(same for all assignment operators)
-[,]()   # ()
+[,]()   # []
 [¥]()   # []
 
 User-defined operators may define their own identity values, but
@@ -1023,9 +1019,7 @@
 and more obviously nonsensical.)
 
 A reduce operator returns only a scalar result regardless of context.
-(Even C[,] returns a single CCapture object which is then spliced
-into the outer argument list.)  To return 

Re: Perl6 style-guide

2006-09-25 Thread Chris Dolan

On Sep 20, 2006, at 6:16 PM, Darren Duncan wrote:


At 4:56 PM +0200 9/20/06, Fagyal Csongor wrote:
I was wondering if there is (or there should be) a documentation  
on how to elegantly write Perl6 code.


I have found that Damian's Perl Best Practices still works very  
well for Perl 6 code, so I still apply that where reasonably possible.


And in fact, I expect that PBP was written to be forward compatible  
to Perl 6, as it could describe styles that should be natural in  
Perl 6, even if less so in Perl 5.


Does anyone want to start a port of Perl::Critic to Perl6?  :-)

Chris

--
Chris Dolan, Software Developer, http://www.chrisdolan.net/
Public key: http://www.chrisdolan.net/public.key
vCard: http://www.chrisdolan.net/ChrisDolan.vcf





FYI improved pugs smokes

2006-09-25 Thread Leopold Toetsch
Hi folks,

Read the journal
  http://pugs.blogs.com/pugs/2006/09/check_smoke_res.html
Follow the link:
  http://m19s28.vlinux.de/cgi-bin/pugs-smokeserv.pl?
Click at a recent entry with a SYN link
Then click on 02 Syntax
Then on e.g.:
- Show the snippet from t/syntax/unicode.t (line 7 ~ line 85  —  26 √, 0 ×) -

This expands the tests related to this topic in the html and even shows test 
success status.

Really cool.

Q: is this helpful for parrot pdds?
Q: implementable?

leo




Re: FYI improved pugs smokes

2006-09-25 Thread jerry gay

On 9/25/06, Leopold Toetsch [EMAIL PROTECTED] wrote:

Hi folks,

Read the journal
  http://pugs.blogs.com/pugs/2006/09/check_smoke_res.html
Follow the link:
  http://m19s28.vlinux.de/cgi-bin/pugs-smokeserv.pl?
Click at a recent entry with a SYN link
Then click on 02 Syntax
Then on e.g.:
- Show the snippet from t/syntax/unicode.t (line 7 ~ line 85  —  26 √, 0 ×) -

This expands the tests related to this topic in the html and even shows test
success status.

Really cool.

Q: is this helpful for parrot pdds?


indeed. it's super cool. i've been working with agent zhang and others
to improve this...


Q: implementable?


...and have been working on an implementation. ideally, i'd like to
get this coded up in pir, but i'm working now on modifying the perl
source. my progress has stalled lately, as i seem to have dropped a
few tuits of the right flavor. i'll merge my changes with the latest
version of smartlinks.pl, and commit something (even if it's broken.)
i'll include some comments or a todo list for those with tuits to
spare.

it does need some extension to work for parrot, particularly because
parrot has two sets of design documents, PDDs for most things, and S05
(plus perhaps others) for PGE. i believe a refactoring of the current
code will allow it to work for multiple sets of documents.
~jerry


Re: Mutability vs Laziness

2006-09-25 Thread Dave Whipp

Aaron Sherman wrote:
It seems to me that there are three core attributes, each of which has 
two states:


Mutability: true, false
Laziness: true, false
Ordered: true, false


I think there's a 4th: exclusivity: whether or not duplicate elements 
are permitted/exposed (i.e. the difference between a set and a bag). 
This is orthogonal to orderedness.


Re: Nitpick my Perl6 - parametric roles

2006-09-25 Thread Sam Vilain
TSa wrote:
   role Collection[\$types] {
has Seq[$types] @.members;
   }
 This is a little wrapper that ensures that collections have got
 a @.members sequence of arbitrary type. This immediately raises
 the question how Seq is defined.
 [...and later...]
 Are you sure that the underlying Seq type handles the one and
 two parameter forms you've used so far?

Ah, yes, a notable omission.  I understood a Seq as a list with
individual types for each element, which are applied positionally.  The
superclass for things like Pair.

Here's a quick mock-up of what I mean:

   role Seq[ \$types ] {
   submethod COMPOSE {  # a la BUILD for classes
   loop( my $i = 0; $i  $types.elems; $i++ ) {
   # assumption: self here is the class
   # we're composing to, and has is a class
   # method that works a little like Moose
   self.has( $i++ = (isa = $types.[$i]) );
   }
   }
   my subset MySeqIndex of Int
   where { 0 = $_  $types.elems };

   method post_circimfix:[ ]( $element: MySeqIndex ) {
   $?SELF.$element;
   }
   }

Seq is certainly interesting for various reasons.  One is that it is a
parametric role that takes an arbitrary set of parameters.  In fact,
it's possible that the type arguments are something more complicated
than a list (making for some very interesting Seq types); the above
represents a capture, but the above code treats it was a simple list.

   role Set[::T = Item] does Collection[T] where {
   all(.members) =:= one(.members);
   };
 
 Nice usage of junctions! But how is the assertion of
 uniqueness transported into methods that handle adding
 of new values?

I haven't defined any mutable state yet; it's still pure.

I'd expect mutability to be a different role, and a set of primitives
that work on this level by returning a new set with the changes made.
In fact the mutable Set could re-use those primitives, by just having a
Set as a member (that 'handles' the Set role methods), and automatically
changing that member each time a change is made, to point to the new Set
with the new contents.

Which all sounds very inefficient and scary until you realise what
happens inside generative GC VMs that support STM.

   role Mapping[::K = Item, ::V = Item] does Collection[Pair[K,V]] {
   all(.members).does(Pair) and
   all(.members).key =:= one(.members).key;
   }
 
 I guess this is a typo and you wanted a where clause. The first
 assertion of the members doing the Pair role should be guaranteed
 by using Pair as the type argument when instantiating the Collection
 role.

Well spotted; yes, that is superfluous.

   role Hash[Str ::K, ::V = Item] does Mapping[K, V]
 
 Will the Str assertion not be too specific for non-string hashes?

Another assumption I make here is that there is a basic type Hash,
which as its name suggests, is all about hashing strings, and that the
more general form is called Mapping where any object can be the
source, not just Str subtypes.

Thanks for your other nitpicks and comments - much appreciated!

Sam.


   where { all(.members).key == one(.members).key }
   {
   method post_circumfix:{ } (K $key) of V|Undefined {
 
 Nice union type as return type. But isn't the type name Undef?
 
   my $seq = first { .key == $key } .members;
 
 Wasn't that @.members?
 
   $seq ?? $seq.value :: undef;
 
 Ternary is spelled ?? !! now.
 
 
   }
   }
  
   role ArrayItem[::V = Item] does Seq[Int, V] {
   method index of Int { .[0] }
   method value of Item { .[1] }
   };
 
 Here we see the two parameter version of Seq at work.
 
 
   role Array of Collection[ArrayItem]
   where { all(.members).index == one(.members).index }
   {
   method post_circumfix:[ ] (Int $index) of Item {
   my $seq = first { .index == $index } .members;
 
 Is this first there a grep-like function? Shouldn't it then
 read 'first { .index == $index }, @.members'?
 
 
   $seq ?? $seq.value :: undef;
   }
   }

 I'll take the feedback I get, and try to make a set of Perl 6 classes in
 the pugs project that look and feel just like regular Perl 6 hash/arrays
 but are expressed in more elementary particles.
 
 This might be very useful in future debates about these types. But
 I think everything hinges on the basic Seq type.
 
 
 Regards, TSa.



Re: Mutability vs Laziness

2006-09-25 Thread Sam Vilain
Aaron Sherman wrote:
 Carried over form IRC to placeholder the conversation as I saw it:
 
 We define the following in S06 as immutable types:
 
 ListLazy Perl list (composed of Seq and Range parts)
 Seq Completely evaluated (hence immutable) sequence
 Range   Incrementally generated (hence lazy) sequence
 Set Unordered Seqs that allow no duplicates
 JunctionSets with additional behaviours
 PairSeq of two elements that serves as a one-element Mapping
 Mapping Pairs with no duplicate keys
 
 It seems to me that there are three core attributes, each of which has
 two states:
 
 Laziness: true, false
 Mutability: true, false
 Ordered: true, false

I don't think Ordered is an attribute of a collection other than in
the abstract, user-centric sense - it is a type parameter difference
(though also there are method differences etc).  Things that are not
ordered map from items to presence (or themselves, if you prefer).
Things that are ordered map from array indices to items.

 There are, thus, eight types of containers, but two (unordered, mutable,
 lazy/eager) don't really work very well, so let's say 6:

Mutable sets don't work?  I don't see why not.

 Ordered,   Immutable, Eager:  Seq
 Ordered,   Immutable, Lazy:   Range and/or Seq of Range?
 Ordered,   Mutable,   Eager:  ?
  Ordered,   Mutable,   Lazy:   Array
 Unordered, Immutable, Eager:  Set
 Unordered, Immutable, Lazy:   x and/or Set of x?
 
 In that last example, x is an unordered range,

Sounds a bit like an iterator.

Sam.


Common Serialization Interface

2006-09-25 Thread Brad Bowman


Both Data::Dumper and Storable provide hooks to customize serialization
($Data::Dumper::Freezer|Toaster, STORABLE_freeze|_thaw).
Other modules like YAML and Clone could also possibly reuse a
common state marshalling interface.

Is there some common element to this process which can be gathered
into a Serialize role with a default implementation?

Does the meta information or object construction process change
the needs for Perl 6?

Brad

--
 It is written that the priest Shungaku said, In just refusing to
 retreat from something one gains the strength of two men. This is
 interesting.-- Hagakure http://bereft.net/hagakure/


Re: Common Serialization Interface

2006-09-25 Thread Mark Stosberg
Brad Bowman wrote:
 
 Both Data::Dumper and Storable provide hooks to customize serialization
 ($Data::Dumper::Freezer|Toaster, STORABLE_freeze|_thaw).
 Other modules like YAML and Clone could also possibly reuse a
 common state marshalling interface.
 
 Is there some common element to this process which can be gathered
 into a Serialize role with a default implementation?

There is already .yaml to serialize to yaml and .perl to serialize
to Perl (I'm not sure what the limits are round-tripping Perl this way).

They can be returned to Perl in a consistent way, too:

eval($yaml, :langyaml);

Still, these options may not substitute for the kind of role-based
solution you have mind.

 Mark



Re: Common Serialization Interface

2006-09-25 Thread Larry Wall
On Mon, Sep 25, 2006 at 09:02:56PM -0500, Mark Stosberg wrote:
: Brad Bowman wrote:
:  
:  Both Data::Dumper and Storable provide hooks to customize serialization
:  ($Data::Dumper::Freezer|Toaster, STORABLE_freeze|_thaw).
:  Other modules like YAML and Clone could also possibly reuse a
:  common state marshalling interface.
:  
:  Is there some common element to this process which can be gathered
:  into a Serialize role with a default implementation?
: 
: There is already .yaml to serialize to yaml and .perl to serialize
: to Perl (I'm not sure what the limits are round-tripping Perl this way).

One thing that makes an enormous practical difference is whether the
entire serialized string must be in memory or not.  (I've been trying
to work with a 37M yaml file recently, sigh...)

: They can be returned to Perl in a consistent way, too:
: 
: eval($yaml, :langyaml);
: 
: Still, these options may not substitute for the kind of role-based
: solution you have mind.

I'm not sure it's wise to overload eval this way.  Seems like a
great way to defeat MMD.  Plus I really want a file interface so I
don't have to slurp a 37M string, which in turn requires a 400M stack
allocation currently.  Seems to want even more heap after that, and
then it really starts thrashing...

Larry


Re: Nitpick my Perl6 - parametric roles

2006-09-25 Thread Ashley Winters

On 9/25/06, Miroslav Silovic [EMAIL PROTECTED] wrote:

TSa wrote:

role Set[::T = Item] does Collection[T] where {
all(.members) =:= one(.members);
};

 Nice usage of junctions!


But buggy - one means *exactly* one. So for an array of more than 1
element, all(@array) never equals one(@array) - if they're all the same,
it's more than 1, otherwise it's 0.


Yeah, that would've been cool. Are we left with asserting
Call(.members »=:=« one(.members))? That'd be pretty close to the
original elegance.

Ashley Winters


Re: Nitpick my Perl6 - parametric roles

2006-09-25 Thread Darren Duncan

At 7:28 PM -0700 9/25/06, Ashley Winters wrote:

On 9/25/06, Miroslav Silovic [EMAIL PROTECTED] wrote:

TSa wrote:


role Set[::T = Item] does Collection[T] where {
all(.members) =:= one(.members);
};


  Nice usage of junctions!

But buggy - one means *exactly* one. So for an array of more than 1
element, all(@array) never equals one(@array) - if they're all the same,
it's more than 1, otherwise it's 0.


Yeah, that would've been cool. Are we left with asserting
Call(.members »=:=« one(.members))? That'd be pretty close to the
original elegance.

Ashley Winters


Unless I'm mistaken, you may be going about this the wrong way.

Within a system that already has an underlying 
set-like type, the Junction in this case, a test 
for uniqueness is (pardon any spelling):


  all(@items).elements.size === @items.size

The all() will strip any duplicates, so if the 
number of elements in all(@items) is the same as 
@items, then @items has no duplicates.


Similarly, if @items is a list of Pair (such as 
when you're implementing a Mapping), and you want 
to assert that their keys are all distinct, then 
this variation (pardon any spelling) would do it:


  all(@items.map:{ .key }).elements.size === @items.size

Incidentally, a unique-key constraint on an RM 
relation or table is like the latter as well, but 
substitute key for the name(s) of the attribute 
or column.


On the other hand, if you're using the above Set 
to implement the Junction in the first place, we 
can't use all/any/one/none etc in the definition.


-- Darren Duncan


[svn:perl6-synopsis] r12417 - doc/trunk/design/syn

2006-09-25 Thread audreyt
Author: audreyt
Date: Mon Sep 25 20:49:59 2006
New Revision: 12417

Modified:
   doc/trunk/design/syn/S02.pod
   doc/trunk/design/syn/S04.pod

Log:
* S02: Introduce the :$$x form in adverbial pair parsing.
* S02/S04: Canonicalize item as the unary context enforcer,
  so that the name Scalar can unabiguous mean the mutable
  container class.

Modified: doc/trunk/design/syn/S02.pod
==
--- doc/trunk/design/syn/S02.pod(original)
+++ doc/trunk/design/syn/S02.podMon Sep 25 20:49:59 2006
@@ -12,9 +12,9 @@
 
   Maintainer: Larry Wall [EMAIL PROTECTED]
   Date: 10 Aug 2004
-  Last Modified: 25 Sept 2006
+  Last Modified: 26 Sept 2006
   Number: 2
-  Version: 72
+  Version: 73
 
 This document summarizes Apocalypse 2, which covers small-scale
 lexical items and typological issues.  (These Synopses also contain
@@ -1481,6 +1481,8 @@
 a = $a:$a
 a = @a:@a
 a = %a:%a
+a = $$a   :$$a
+a = @$$a  :@$$a (etc.)
 a = %fooa   %foo:a
 
 Note that as usual the C{...} form can indicate either a closure or a hash
@@ -2142,6 +2144,8 @@
 really does exactly the same thing as putting a list in parentheses with
 at least one comma.  But it's more readable in some situations.)
 
+To force a non-flattening scalar context, use the Citem operator.
+
 =item *
 
 The C| prefix operator may be used to force capture context on its

Modified: doc/trunk/design/syn/S04.pod
==
--- doc/trunk/design/syn/S04.pod(original)
+++ doc/trunk/design/syn/S04.podMon Sep 25 20:49:59 2006
@@ -12,9 +12,9 @@
 
   Maintainer: Larry Wall [EMAIL PROTECTED]
   Date: 19 Aug 2004
-  Last Modified: 24 Sep 2006
+  Last Modified: 26 Sep 2006
   Number: 4
-  Version: 40
+  Version: 41
 
 This document summarizes Apocalypse 4, which covers the block and
 statement syntax of Perl.
@@ -933,7 +933,7 @@
 and not care about whether the function is being called in scalar or list
 context.  To return an explicit scalar undef, you can always say
 
-return scalar(undef);
+return item(undef);
 
 Then in list context, you're returning a list of length 1, which is
 defined (much like in Perl 5).  But generally you should be using