¿Qué consejos generales tienes para jugar al golf en Racket / Scheme ? Estoy buscando ideas que puedan aplicarse a los problemas de golf de código en general que sean al menos algo específicos para Racket / Scheme (por ejemplo, "eliminar comentarios" no es una respuesta).
Sé que Scheme and Racket (anteriormente PLT Scheme) son lenguajes técnicamente diferentes, pero son bastante similares en muchos aspectos y sospecho que mucho código se ejecutará principalmente según lo previsto. Si su sugerencia solo se aplica a uno de los idiomas mencionados anteriormente, tenga en cuenta como tal.
let
lambda
En raqueta , los
require
formularios pueden tener múltiples argumentos.Es mucho más corto que
No sé mucho acerca de Scheme , pero no parece tener una función
require
incorporada.fuente
Usa sinónimos más cortos
Hay una serie de procedimientos en Racket que tienen versiones más cortas en su mayoría equivalentes. (Por lo general, no son equivalentes: por ejemplo,
(car (cons 1 2))
funciona donde(first (cons 1 2))
falla. Pero puede hacer la sustitución si sabe que son sinónimos en su caso).Esta lista probablemente esté incompleta: probablemente todavía no conozco la mayoría de las cosas que podrían incluirse en esta lista.
(= a b)
en lugar de(equal? a b)
al comparar números.'(1 2)
en lugar de(list 1 2)
.car
,cadr
,cdr
Parafirst
,second
, yrest
.null?
en lugar deempty?
modulo
en lugar deremainder
cuando el módulo es positivo.floor
en lugar detruncate
cuando su argumento es positivo.fuente
Omitir espacios innecesarios
Esto puede considerarse un consejo "trivial", pero debe señalarse en alguna parte.
Cada vez que lea el código de Racket escrito por personas normales (por ejemplo, en la documentación de Racket ) tendrá todos los espacios puestos: por ejemplo,
De hecho, desde
(
y)
no puede ser parte de nombres de variables, podemos eliminar todos los espacios alrededor de ellos y no perder ninguna ambigüedad (y, más importante, aún así obtener un código válido). Entonces, la expresión anterior puede ser:fuente
Los siguientes consejos son para Racket :
Argumentos predeterminados
Especialmente útil para crear alias para nombres largos de funciones que se usan con frecuencia.
Suponga que el golf le permite escribir una función que consume el argumento, y suponga que necesita usar
reverse
mucho. Comenzarás con algo como:En su lugar, puede tomar un argumento adicional, con un nombre más corto que
reverse
, y establecer su valor predeterminado enreverse
:Además, es útil si tiene una función auxiliar que usa en muchos lugares con algunos de los mismos argumentos. Recuerde reordenar los argumentos a la función según sea necesario, para que pueda usar tantos argumentos predeterminados como sea posible y eliminar los argumentos de múltiples sitios de llamadas.
match
Este es un poco más difícil de resumir en una publicación pequeña, así que lea sobre Racket Docs para este. En pocas palabras, le
match
permite extraer elementos y secuencias de elementos en un cierto orden de una lista, y la sintaxis de cuasiquote le permite volver a unir la lista mutilada:También le brinda una manera fácil de trabajar con expresiones regulares y realizar cálculos adicionales en los grupos resultantes después,
Llamado
let
Vea la sintaxis nombrada aquí .
let proc-id ...
Esto le permite escribir funciones recursivas que se llaman inmediatamente sin
define
o realmente llamando a la función después de haberla definido.Algo como:
se puede acortar a:
Este último es una tontería, pero hasta ahora no he podido usar este pequeño truco en ninguna parte:
(apply map list matrix)
toma una transposición dematrix
, dondematrix
hay una lista rectangular de listas, como'((1 2 3) (a b c))
.Avíseme si esto resulta útil.
fuente
Como señaló Winny ,
#!
generalmente se puede usar en lugar de#lang
ahorrar cuatro bytes.fuente