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.
Respostas:
Pedir parâmetros de função para minimizar o espaço em branco
Ao invés de
tente algo como
fonte
Imprimir seqüências de caracteres que consistem em letras maiúsculas através de átomos
A
princ
funçã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,
irá imprimir
HAI
.E
imprimirá
HAI
, solicitará entrada e imprimirá novamente, por exemplo, se você digitar Olá, o resultado seráfonte
Use
1+
e1-
para incremento e decrementoEm vez de
(+ a 1)
ou(- b 1)
tente(1+ a)
ou(1- b)
.fonte
1+
analisado como dois tokens1
e+
? Eu pensei que era+1
.1+
e1-
são analisados como um único token função comum Lisp HyperSpec 1+, 1-Use
loop
eformat
, que é comoprintf
em esteróides.format
inclui 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.fonte
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 umv
modificador para consumir um argumento, caso em que termina se esse argumento for zero. Isso é particularmente útil para lidar com o zero produzido pordotimes
.format(condition)
O primeiro argumento para
format
pode ser um dost
,nil
também conhecido como()
, ou um fluxo. Se passadot
, ele produzirá parastdout
, senil
ele 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: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 umdo
loop:~[...~]
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.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 afresh-line
.Ambos
~%
e~&
também podem aceitar um argumento, com umv
modificador 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
fonte