Советы по игре в гольф в Лиспе

9

Какие общие советы для игры в гольф на Лиспе (любой диалект)? Пожалуйста, публикуйте один совет за ответ, и только ответы, которые относятся к диалекту Лисп (например, «удалить комментарии» не является ответом).

Пожалуйста, опубликуйте диалект Lisp, к которому относится ваш совет.

NoOneIsHere
источник
3
xkcd.com/297
Джеймс
1
Вы думаете, они будут отличаться от советов по игре в гольф в Схеме и Ракетке ?
Алекс А.
1
Я бы посоветовал использовать tinylisp, уменьшенную урезанную версию Lisp для вашего удовольствия от игры в гольф.
ckjbgames

Ответы:

4

Параметры функции заказа для минимизации пробелов

Вместо

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

попробуй что-то вроде

(defun f(b a)(...))
...
(f(1+ y)x)
ceilingcat
источник
1

Печать строк, состоящих из заглавных букв, через печать атомов

princФункция Common Lisp коротка, и будет печатать объекты без побега characers. Если вы печатаете символы Common Lisp, которые имеют synax 'symbol-name, это избавит вас от необходимости заключать в кавычки то, что вы хотите напечатать, а также сэкономить на пустом месте. Обратите внимание, что при печати символов они будут написаны заглавными буквами. Кроме того, он не добавляет символ новой строки или пробел, поэтому вам не нужно объединять.

Например,

(princ'hai)

напечатает HAI.

А также

(princ'hai)(princ(read))

будет распечатывать HAI, запрашивать ввод и распечатывать его обратно, например, если вы введете привет, результат будет

HAIhellohello
Matceporial
источник
1

Используйте 1+и 1-для увеличения и уменьшения

Вместо (+ a 1)или (- b 1)попробуйте (1+ a)или (1- b).

ceilingcat
источник
Я не понимаю этого. Не 1+разбирается ли как два токена, 1а +? Я думал, что это было +1.
Esolanging Fruit
@ Challenger5 1+и 1-обрабатываются как единый лексем Common Lisp HyperSpec Функция 1+, 1-
ceilingcat
Я думал, что имена не могут начинаться с цифр?
Esolanging Fruit
@EsolangingFruit это является Лисп ...
ASCII-только
1

Используйте loopи format, как printfна стероидах. formatвключает в себя итерацию и условия, а также римские цифры, английские цифры и английские множественные числа. Это очень, очень некрасиво и очень компактно.

Майкл Верс
источник
1

Условный вывод

GNU Common Lisp

~v^

Вверх и из директивы ~^наиболее часто используется в списке операции форматирования прекратить после последнего элемента списка. Однако его также можно использовать с vмодификатором для получения аргумента, и в этом случае он завершается, если этот аргумент равен нулю. Это особенно полезно для борьбы с нулем, создаваемым 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)

Первым аргументом formatможет быть один t, nilaka ()или поток. Если он пройден t, он будет выводить в stdout, если nilон вернет форматированный вывод в виде строки. Это можно использовать условно на выходе. Приведенный выше пример можно записать так же коротко, как:

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

Если значение было выведено, возвращаемое значение будет nil. Из-за этого его также можно использовать как условие завершения doцикла:

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

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

~[...~]

Условный модуль форматирования использует аргумент и выбирает строку форматирования из списка по индексу. Обычный вариант использования - форматер ~:;по умолчанию для выбора между нулем и не нулем.

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

Условные средства форматирования также могут быть вложенными, и в этом случае каждый из них будет использовать аргумент по очереди.


~&

В каждом из приведенных выше примеров, ~%используется для выделения новой строки. В большинстве случаев это можно заменить буквальным переводом строки. Другим вариантом является использование ~&, которое будет испускать новую строку тогда и только тогда, когда выходной курсор находится не в начале строки, иначе a fresh-line.

И то ~%и другое ~&может также принимать аргумент с vмодификатором или в виде константы, и будет производить столько строк перевода. Они также с радостью примут отрицательный аргумент, и в этом случае они ничего не излучают.


Внешние ссылки

Практический Common Lisp
18. Несколько рецептов FORMAT

Common Lisp the Language, 2-е издание
22.3.3. Форматированный вывод в символьные потоки

Примо
источник