Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

268
Visualizações
Comportamientos inesperados con Raku lambdas que se supone que son iguales (supongo)

Estoy aprendiendo Raku como un proyecto apasionante y quería implementar un fizzbuzz simple , ¿por qué join solo retiene el zumbido si escribo lambdas con bloques puntiagudos?

 my $iif =-> $x,$y,$z {if $x {$y} else {$z}} my $modToString =-> $x,$y,$z {$iif($x%%$y,$z,'')} my $FB =-> $x {join($modToString($x,3,'fizz'),$modToString($x,5,'buzz'))} my $logic =-> $x {$iif($FB($x),$FB($x),$x)} say map(-> $x {$logic($x)}, 1..100) $modToString(1,3,'fizz') > $modToString(3,3,'fizz') > fizz $modToString(3,5,'buzz') > $modToString(5,5,'buzz') > buzz

Si transformo las variables de bloques puntiagudos en variables de marcador de posición, Rakudo arroja un error:

 my $iif = {if $^x {$^y} else {$^z}}; my $modToString = {$iif($^x%%$^y,$^z,'')}; my $FB = {join($modToString($^x,3,'fizz'),$modToString($^x,5,'buzz'))} my $logic = {$iif($FB($^x),$FB($^x),$^x)} say map(-> $x {$logic($x)}, 1..100) Too many positionals passed; expected 1 argument but got 3 in block at <unknown file> line 1 in block at <unknown file> line 1 in block at <unknown file> line 1 in block at <unknown file> line 1 in block <unit> at <unknown file> line 1

Si pongo los corchetes alrededor de los argumentos de combinación, solo genera los números:

 my $iif =-> $x,$y,$z {if $x {$y} else {$z}} my $modToString =-> $x,$y,$z {$iif($x%%$y,$z,'')} my $FB =-> $x {join(<$modToString($x,3,'fizz'),$modToString($x,5,'buzz')>)} my $logic =-> $x {$iif($FB($x),$FB($x),$x)} say map(-> $x {$logic($x)}, 1..100)

¿Por qué?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Porque muchas cosas en Raku son bloques, incluso cosas que no lo parecen. En particular, esto incluye el "argumento" para controlar el flujo como if .

 if 1 { 2 } else { 3 }

De hecho, hemos escrito dos bloques aquí. Una es una función constante que devuelve 2 y la otra es una función constante que devuelve 3 . Ahora, por lo general, esto es transparente para nosotros y el motor Raku es lo suficientemente inteligente como para compilarlos. Pero todavía están allí. De hecho, podemos hacerlos explícitos. Lo siguiente se comporta de manera idéntica a la declaración if anterior.

 if 1 -> { 2 } else -> { 3 }

En tu caso, sin embargo, termina importando. Los argumentos anónimos (los que tienen ^ twigil) se unen al bloque más interno. Así que has escrito

 {if $^x {$^y} else {$^z}}

y pretendías que fuera equivalente a

 -> $x, $y, $z {if $x {$y} else {$z}}

pero lo que en realidad escribiste fue

 -> $x {if $x -> $y {$y} else -> $z {$z}};

Así que realmente escribió una función de un argumento y le pasó tres argumentos, como indica el mensaje de error.

Como regla general, generalmente puede asumir que cada vez que vea un { , comienza un hash literal o un bloque. Y este último siempre introduce un ámbito en el que pueden existir variables y argumentos locales.

En tu caso particular, puedes usar el ternario ??!! operador (esto es lo mismo que ?: en la mayoría de los otros lenguajes como C++ o Java)

 {$^x ?? $^y !! $^z}

Este operador no hace cortocircuito y no introduce bloques, por lo que funcionará bien.

over 4 years ago · Santiago Trujillo Relatório

0

Migración de la solución de OP de la pregunta a una respuesta.

¡Después de la respuesta de Silvio Mayolo entendí el problema y también señalaron que escribí un operador ternario sin sentido!

¡También escribí join en lugar de la tilde! Estoy feliz de decir que mi fizzbuzz ahora funciona:

 my $modToString =-> $x,$y,$z {$x%%$y??$z!!''} my $FB =-> $x {$modToString($x,3,'fizz')~$modToString($x,5,'buzz')} my $logic =-> $x {$FB($x)??$FB($x)!!$x} say map(-> $x {$logic($x)}, 1..100)
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda