¿Qué consejos generales son estos para jugar al golf en Lisp (cualquier dialecto)? Publique un consejo por respuesta, y solo las respuestas que sean específicas de un dialecto de Lisp (por ejemplo, "eliminar comentarios" no es una respuesta).
Publique el dialecto de Lisp al que se aplica su propina con su propina.
Respuestas:
Ordenar parámetros de función para minimizar espacios en blanco
En vez de
prueba algo como
fuente
Imprimir cadenas que consisten en letras mayúsculas a través de átomos de impresión
La
princ
función en Common Lisp es corta e imprimirá objetos sin caracteres de escape. Si imprime símbolos Common Lisp, que tienen la sinax'symbol-name
, esto evita que necesite comillas alrededor de lo que desea imprimir, y también puede ahorrar en espacios en blanco. Tenga en cuenta que al imprimir símbolos, se capitalizarán. Además, no agrega una nueva línea o un espacio, por lo que no necesita concatenación.Por ejemplo,
imprimirá
HAI
.Y
imprimirá
HAI
, solicitará datos e imprimirá de nuevo, por ejemplo, si escribe hola, el resultado esfuente
Uso
1+
y1-
para incremento y decrementoEn lugar de
(+ a 1)
o(- b 1)
intente(1+ a)
o(1- b)
.fuente
1+
analiza como dos tokens,1
y+
? Pensé que era+1
.1+
y1-
se analizan como un solo token Common Lisp HyperSpec Function 1+, 1-Use
loop
yformat
, que es comoprintf
en los esteroides.format
incluye iteración y condiciones, así como números romanos, números en inglés y plurales en inglés. Es muy, muy feo y muy compacto.fuente
Salida condicional
GNU Common Lisp
~v^
La directiva up-and-out
~^
se usa más comúnmente en una operación de formato de lista para terminar después del último elemento de la lista. Sin embargo, también se puede usar con unv
modificador para consumir un argumento, en cuyo caso termina si ese argumento es cero. Esto es particularmente útil para tratar con el cero producido pordotimes
.format(condition)
El primer argumento para
format
puede ser unot
,nil
aka()
, o una secuencia. Si se pasat
, saldrá astdout
, sinil
devolverá la salida formateada como una cadena. Esto se puede usar condicionalmente salida. El ejemplo anterior podría escribirse igualmente tan corto como:Si se emitió un valor, el valor de retorno será
nil
. Debido a esto, también se puede usar como condición de terminación para undo
bucle:~[...~]
El formateador condicional consume un argumento y selecciona una cadena de formato de una lista por índice. Un caso de uso común es con el formateador predeterminado
~:;
para seleccionar entre cero y no cero.Los formateadores condicionales también se pueden anidar, en cuyo caso cada uno consumirá un argumento a su vez.
~&
En cada uno de los ejemplos anteriores,
~%
se utiliza para emitir una nueva línea. En la mayoría de los casos, esto podría ser reemplazado por una nueva línea literal. Otra opción es usar~&
, que emitirá una nueva línea si y solo si el cursor de salida no está al comienzo de una línea, también conocido como afresh-line
.Ambos
~%
y~&
también pueden tomar un argumento, con unv
modificador o como una constante, y producirán tantas líneas nuevas. Ambos también aceptarán felizmente un argumento negativo, en cuyo caso no emitirán nada.Referencias externas
Práctico Common Lisp
18. Algunas Recetas FORMATO
Common Lisp the Language, 2ª edición
22.3.3. Salida formateada a secuencias de caracteres
fuente