develooper Front page | perl.perl6.users | Postings from February 2019

Re: list comprehension

Thread Previous
From:
=?utf-8?B?Sm9hbiBQdWpvbCBUYXJyw6lz?=
Date:
February 21, 2019 17:38
Subject:
Re: list comprehension
Message ID:
20190213011935.GA8861@mimomedia
El Monday, 11 de February del 2019 a les 17:04, Brad Gilbert va escriure:

>Actually I would suggest NOT adding Perl6, because the best way to
>create a Set is not to use “list comprehension”, but to just call
>`.Set`

Ups :O .Thanks for the conceptual clarification. :D  I will leave Perl6 
out of the wikipedia article. 

Cheers! 

>On Mon, Feb 11, 2019 at 12:51 PM mimosinnet <mimosinnet@gmail.com> 
>wrote:
>>
>> Dear Brad,
>>
>> Thanks very much for the answer. I have been playing with your examples in the
>> code below (and learned a lot!). Based on your insight, I would suggest these
>> solutions to be added to the wikipedia:
>> https://en.wikipedia.org/wiki/Set-builder_notation#Parallels_in_programming_languages
>>
>> Example1: Set.new: gather { for L { take $_ } };
>> Example2: Set.new: cross( K, X.grep: P(x) );
>>
>> Cheers!
>>
>> <--- Working code
>> my \L = 1..10; my \K = 1..10; my \X = 5..15;
>>
>> # Example 1
>> my $e1 = Set.new: gather { for L { take $_ } };
>>
>> # Example 2
>> my $s1 = Set.new: gather {
>>    for K -> \k {
>>        for X -> \x {
>>            if x < 8 {
>>                take (k,x);
>>            }
>>        }
>>    }
>> }
>> my $s2 = Set.new: (K X[,] X).grep: -> ( \k, \x ) { x < 8 };
>> my $s3 = Set.new: ( -> \x { |(-> \k { (k,x) if x < 8 } for K) } for X );
>> my $s4 = Set.new: gather { -> \k { -> \x { take (k,x) if x < 8; } for X } for K }
>> my $s5 = Set.new: cross( K, X.grep: * < 8 );
>>
>> say $e1; say $s1; say $s2; say $s3; say $s4; say $s5;
>> <---
>>
>> El Sunday, 10 de February del 2019 a les 12:05, Brad Gilbert va
>> escriure:
>>
>> >In
>> >
>> >     {l for l in L}
>> >
>> >The reason it is in `{}` is to create a Set from iterating over `L`.
>> >
>> >> In Python, the set-builder's braces are replaced with square brackets, parentheses, or curly braces, giving list, generator, and set objects, respectively.
>> >
>> >So in Python:
>> >
>> >    [ l for l in L ]     gives a list
>> >    ( l for l in L )     gives a generator
>> >    { l for l in L }     gives a set
>> >
>> >In Perl6 those would most likely be written as:
>> >
>> >    L.List   or   L.Array   or   L.list
>> >    L.Seq
>> >    L.Set
>> >
>> >---
>> >
>> >The way to do that is
>> >
>> >    my \L = ((1..10) xx 3).flat.pick(*).list;
>> >
>> >    set( L ) # A
>> >    L.Set # B
>> >
>> >    my %set is SetHash;
>> >    { ++%set{$_} for L }  # C
>> >
>> >    # D
>> >    do {
>> >        # add the {} syntax to create a Set (lexically)
>> >        my sub circumfix:«{ }» ( \L ) { L.Set };
>> >
>> >        { $_ for L } # <--
>> >    }
>> >
>> >Something that seems similar to me is `unique`
>> >
>> >    .say for L.unique;
>> >
>> >By that I mean, some places where you would use a Set, it makes sense
>> >to use `.unique` instead
>> >
>> >---
>> >
>> >As for `{(k, x) for k in K for x in X if P(x)}`
>> >
>> >The easiest one to directly translate appears to be the Scala one
>> >
>> >    my \K = 1..10;
>> >    my \X = 5..15;
>> >
>> >    # for (k <- K; x <- X if P(x)) yield (k,x)
>> >    Set.new: gather {
>> >        for K -> \k {
>> >            for X -> \x {
>> >                if P(x) {
>> >                    take (k,x);
>> >                }
>> >            }
>> >        }
>> >    }
>> >
>> >Other ways:
>> >
>> >    Set.new: (K X[,] X).grep: -> ( \k, \x ) { P(x) }
>> >
>> >    Set.new: K X[,] X.grep: &P
>> >
>> >    Set.new: K X[,] X.grep: &P
>> >
>> >    Set.new: ( -> ( \k, \x ) { (k,x) if P(x) } for K X[,] X )
>> >
>> >    Set.new: ( -> \x { |(-> \k { (k,x) if P x } for K) } for X)
>> >
>> >On Sun, Feb 10, 2019 at 10:26 AM mimosinnet <mimosinnet@gmail.com> wrote:
>> >>
>> >> Hi all,
>> >>
>> >> I wonder what would be the Perl notation for 'set-builders', as exposed
>> >> in this wikipedia article:
>> >>
>> >> https://en.wikipedia.org/wiki/Set-builder_notation#Parallels_in_programming_languages
>> >>
>> >> This is the Python notation:
>> >>
>> >> Example 1: {l for l in L}
>> >> Example 2: {(k, x) for k in K for x in X if P(x)}
>> >>
>> >> This is another example in Python:
>> >>
>> >> s = {v for v in 'ABCDABCD' if v not in 'CB'}
>> >>
>> >> https://en.wikipedia.org/wiki/List_comprehension#Similar_constructs
>> >>
>> >> I have been playing with the code below. Nevertheless, I am unsure on
>> >> how to use the code to define a set.
>> >>
>> >> Cheers!
>> >>
>> >> <--- Code
>> >> #!/usr/bin/env perl6
>> >>
>> >> my @L = 1 .. 10;
>> >> my @K = 1 .. 10;
>> >> my @X = 5 .. 15;
>> >>
>> >> say "Example 1:";
>> >> for @L -> $l {
>> >>   print "$l " if $l ∈ @L;
>> >> }
>> >>
>> >> say "\nExample 2:";
>> >> for @K -> $k { for @X -> $x {
>> >>     print "($k, $x), " if ($k ∈ @K and $x ∈ @X and $x < 8);
>> >> }}
>> >> <---
>> >>
>> >> --
>> >> (≧∇≦) Mimosinnet (Linux User: #463211)
>>
>> --
>> (≧∇≦) Mimosinnet (Linux User: #463211)
>>
>> (≧∇≦) Ningún Lugar
>> ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
>> ★ Activisme Cultural per a la Transformació Social
>>
>> (≧∇≦) Fractalitats en Investigació Crítica
>> ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
>> * Investigació Crítica per a la Transformació Social
>> * http://psicologiasocial.uab.es/fic
>>

-- 

Joan Pujol Tarrés
Departament de Psicologia Social
Facultat de Psicologia, Universitat Autònoma de Barcelona
Despatx: B5-036 (Passadís Departament Psicologia Social)
Edifici B, 08193 Bellaterra (Barcelona), Fax: +34 935812001

http://orcid.org/0000-0002-0462-3278
https://portalrecerca.csuc.cat/orcid/0000-0002-0462-3278

Thread Previous


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About