Consejos para jugar al golf en Lisp


9

¿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.



1
¿Crees que estos serán distintos de los consejos para jugar al golf en Scheme and Racket ?
Alex A.

1
Aconsejaría usar tinylisp, una versión más pequeña y simplificada de Lisp para su placer de golf.
ckjbgames

Respuestas:


4

Ordenar parámetros de función para minimizar espacios en blanco

En vez de

(defun f(a b)(...))
...
(f x(1+ y))

prueba algo como

(defun f(b a)(...))
...
(f(1+ y)x)

1

Imprimir cadenas que consisten en letras mayúsculas a través de átomos de impresión

La princfunció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,

(princ'hai)

imprimirá HAI.

Y

(princ'hai)(princ(read))

imprimirá HAI, solicitará datos e imprimirá de nuevo, por ejemplo, si escribe hola, el resultado es

HAIhellohello


1

Use loopy format, que es como printfen los esteroides. formatincluye 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.


1

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 un vmodificador para consumir un argumento, en cuyo caso termina si ese argumento es cero. Esto es particularmente útil para tratar con el cero producido por dotimes.

(loop as n from 1 to 10 do(format t"~d~%"n))

(dotimes(n 11)(if(> n 0)(format t"~d~%"n)))

(dotimes(n 11)(format t"~v^~d~%"n n))

format(condition)

El primer argumento para formatpuede ser uno t, nilaka (), o una secuencia. Si se pasa t, saldrá a stdout, si nildevolverá la salida formateada como una cadena. Esto se puede usar condicionalmente salida. El ejemplo anterior podría escribirse igualmente tan corto como:

(dotimes(n 11)(format(> n 0)"~d~%"n))

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 un dobucle:

(do((n 11))((<(decf n)1))(format t"~d~%"n))

(do((n 11))((format(>(decf n)0)"~d~%"n)))

~[...~]

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.

(dotimes(n 11)(format t"~v^~[~r~:;~d~]~%"n(mod n 3)n))

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 a fresh-line.

Ambos ~%y ~&también pueden tomar un argumento, con un vmodificador 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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.