Dicas para jogar golfe em Lisp


9

Que dicas gerais são essas para jogar golfe em Lisp (qualquer dialeto)? Por favor, poste uma dica por resposta, e apenas respostas específicas para um dialeto do Lisp (por exemplo, "remover comentários" não são uma resposta).

Poste o dialeto de Lisp ao qual sua dica se aplica.



11
Você imagina que isso será diferente das dicas para jogar golfe em Scheme and Racket ?
Alex A.

11
Eu recomendaria o uso do tinylisp, uma versão menor e reduzida do Lisp para o seu prazer no golfe.
Ckjbgames

Respostas:


4

Pedir parâmetros de função para minimizar o espaço em branco

Ao invés de

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

tente algo como

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

1

Imprimir seqüências de caracteres que consistem em letras maiúsculas através de átomos

A princfunção no Common Lisp é curta e imprime objetos sem caracteres de escape. Se você imprimir símbolos Common Lisp, que possuem a sinaxia 'symbol-name, isso evita que você precise de aspas ao redor do que deseja imprimir e também pode economizar espaço em branco. Observe que, ao imprimir símbolos, eles serão maiúsculos. Além disso, ele não adiciona uma nova linha ou espaço, portanto você não precisa de concatenação.

Por exemplo,

(princ'hai)

irá imprimir HAI.

E

(princ'hai)(princ(read))

imprimirá HAI, solicitará entrada e imprimirá novamente, por exemplo, se você digitar Olá, o resultado será

HAIhellohello


1

Use loope format, que é como printfem esteróides. formatinclui iteração e condições, bem como números romanos, números em inglês e plurais em inglês. É muito, muito feio e muito compacto.


1

Saída Condicional

Lisp Comum GNU

~v^

A diretiva up-and-out~^ é mais comumente usada em uma operação de formatação de lista para terminar após o último item da lista. No entanto, também pode ser usado com um vmodificador para consumir um argumento, caso em que termina se esse argumento for zero. Isso é particularmente útil para lidar com o zero produzido 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)

O primeiro argumento para formatpode ser um dos t, niltambém conhecido como (), ou um fluxo. Se passado t, ele produzirá para stdout, se nilele retornará a saída formatada como uma sequência. Isso pode ser usado como saída condicional. O exemplo acima pode ser escrito igualmente tão curto quanto:

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

Se um valor foi emitido, o valor de retorno será nil. Por esse motivo, também pode ser usado como condição de término para um doloop:

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

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

~[...~]

O formatador condicional consome um argumento e seleciona uma sequência de formatação de uma lista por índice. Um caso de uso comum é com o formatador padrão ~:;para selecionar entre zero e não zero.

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

Os formatadores condicionais também podem ser aninhados; nesse caso, cada um deles consumirá um argumento por sua vez.


~&

Em cada um dos exemplos acima, ~%é usado para emitir uma nova linha. Na maioria dos casos, isso pode ser substituído por uma nova linha literal. Outra opção é usar ~&, que emitirá uma nova linha se e somente se o cursor de saída não estiver no início de uma linha, também conhecido como a fresh-line.

Ambos ~%e ~&também podem aceitar um argumento, com um vmodificador ou como uma constante, e produzirão tantas novas linhas. Os dois também aceitarão com satisfação um argumento negativo, caso em que não emitem nada.


Referências externas

Lisp Prático Comum
18. Algumas Receitas de FORMATO

Common Lisp the Language, 2ª Edição
22.3.3. Saída formatada para fluxos de caracteres

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.