Que dicas gerais você tem para jogar golfe no Racket / Scheme ? Estou procurando idéias que possam ser aplicadas aos problemas de código de golfe em geral, que sejam pelo menos um pouco específicos para a raquete / esquema (por exemplo, "remover comentários" não é uma resposta).
Estou ciente de que Scheme e Racket (anteriormente PLT Scheme) são linguagens tecnicamente diferentes, mas são bastante similares em muitos aspectos e muito código (suspeito) será executado principalmente como pretendido. Se sua dica se aplicar apenas a um dos idiomas mencionados acima, observe como tal.
let
lambda
No Raquete , os
require
formulários podem ter vários argumentos.É bem menor que
Eu não sei muito sobre o Scheme , mas ele não parece ter um
require
builtin.fonte
Use sinônimos mais curtos
Existem vários procedimentos no Racket que têm versões mais curtas equivalentes. (Eles geralmente não são equivalentes: por exemplo,
(car (cons 1 2))
funciona onde(first (cons 1 2))
falha. Mas você pode fazer a substituição se souber que são sinônimos no seu caso.)Essa lista provavelmente está incompleta: eu provavelmente ainda não conheço a maioria das coisas que poderiam estar nessa lista.
(= a b)
em vez de(equal? a b)
comparar números.'(1 2)
em vez de(list 1 2)
.car
,cadr
,cdr
Parafirst
,second
, erest
.null?
ao invés deempty?
modulo
em vez deremainder
quando o módulo é positivo.floor
em vez detruncate
quando seu argumento é positivo.fonte
Omita espaços desnecessários
Isso pode ser considerado uma dica "trivial", mas precisa ser apontada em algum lugar.
Sempre que você ler o código do Racket escrito por pessoas normais (por exemplo, na documentação do Racket ), todos os espaços serão inseridos: por exemplo,
Na verdade, uma vez
(
e)
não pode ser parte de nomes de variáveis, podemos eliminar todos os espaços em torno deles e não perder qualquer ambiguidade (e, mais importante, ainda obter um código válido). Portanto, a expressão acima pode ser:fonte
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:Em vez disso, você pode
reverse
usar um argumento adicional, com um nome menor que , e definir seu valor padrão parareverse
: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: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 aqui
let 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:
pode ser reduzido para:
Este último é bobo, mas não pude usar esse pequeno truque em nenhum lugar até agora:
(apply map list matrix)
faz uma transposição dematrix
, ondematrix
está uma lista retangular de listas, como'((1 2 3) (a b c))
.Deixe-me saber se isso é útil.
fonte
Como Winny apontou ,
#!
geralmente pode ser usado em vez de#lang
, economizando quatro bytes.fonte