As dicas a seguir são para o Racket :
Argumentos padrão
Especialmente útil para criar aliases para nomes longos de funções usados com freqüência.
Suponha que o golfe permita escrever uma função que consome o argumento e suponha que você precise usar reverse
muito. Você começará com algo como:
(λ(x) ... reverse ... reverse ... reverse ...
Em vez disso, você pode reverse
usar um argumento adicional, com um nome menor que , e definir seu valor padrão para reverse
:
(λ(x[r reverse]) ... r ... r ... r ...
Além disso, é útil se você tiver uma função auxiliar usada em muitos lugares com alguns dos mesmos argumentos. Lembre-se de reordenar os argumentos para a função, conforme necessário, para que você possa usar o maior número possível de argumentos padrão e remover os argumentos de vários callites.
match
Este é um pouco mais difícil de resumir em um pequeno post, então leia os Documentos da Raquete para este. Em poucas palavras, match
permite extrair elementos e seqüências de elementos em uma determinada ordem de uma lista, e a sintaxe de quaseiquote permite costurar a lista mutilada novamente:
(match (range 10)
[`(,xs ... 3 ,ys ... 6 ,zs ...)
`(,@(map f xs) 3 ,@(map f ys) 6 ,@(map f sz))]
...
Também oferece uma maneira fácil de trabalhar com expressões regulares e fazer cálculos adicionais nos grupos resultantes posteriormente,
Nomeado let
Veja a sintaxe nomeada aquilet proc-id ...
.
Isso permite que você escreva funções recursivas chamadas imediatamente sem define
ou realmente chame a função depois que você a definir.
Algo como:
(define (fib i)
(if (< i 2) i
(+ (fib (- i 1)) (fib (- i 2)))))
(fib 10)
pode ser reduzido para:
(let fib {[i 10]}
(if (< i 2) i
(+ (fib (- i 1)) (fib (- i 2)))))
Este último é bobo, mas não pude usar esse pequeno truque em nenhum lugar até agora:
(apply map list matrix)
faz uma transposição de matrix
, onde matrix
está uma lista retangular de listas, como '((1 2 3) (a b c))
.
Deixe-me saber se isso é útil.