Какие общие советы для игры в гольф на Лиспе (любой диалект)? Пожалуйста, публикуйте один совет за ответ, и только ответы, которые относятся к диалекту Лисп (например, «удалить комментарии» не является ответом).
Пожалуйста, опубликуйте диалект Lisp, к которому относится ваш совет.
Ответы:
Параметры функции заказа для минимизации пробелов
Вместо
попробуй что-то вроде
источник
Печать строк, состоящих из заглавных букв, через печать атомов
princ
Функция Common Lisp коротка, и будет печатать объекты без побега characers. Если вы печатаете символы Common Lisp, которые имеют synax'symbol-name
, это избавит вас от необходимости заключать в кавычки то, что вы хотите напечатать, а также сэкономить на пустом месте. Обратите внимание, что при печати символов они будут написаны заглавными буквами. Кроме того, он не добавляет символ новой строки или пробел, поэтому вам не нужно объединять.Например,
напечатает
HAI
.А также
будет распечатывать
HAI
, запрашивать ввод и распечатывать его обратно, например, если вы введете привет, результат будетисточник
Используйте
1+
и1-
для увеличения и уменьшенияВместо
(+ a 1)
или(- b 1)
попробуйте(1+ a)
или(1- b)
.источник
1+
разбирается ли как два токена,1
а+
? Я думал, что это было+1
.1+
и1-
обрабатываются как единый лексем Common Lisp HyperSpec Функция 1+, 1-Используйте
loop
иformat
, какprintf
на стероидах.format
включает в себя итерацию и условия, а также римские цифры, английские цифры и английские множественные числа. Это очень, очень некрасиво и очень компактно.источник
Условный вывод
GNU Common Lisp
~v^
Вверх и из директивы
~^
наиболее часто используется в списке операции форматирования прекратить после последнего элемента списка. Однако его также можно использовать сv
модификатором для получения аргумента, и в этом случае он завершается, если этот аргумент равен нулю. Это особенно полезно для борьбы с нулем, создаваемымdotimes
.format(condition)
Первым аргументом
format
может быть одинt
,nil
aka()
или поток. Если он пройденt
, он будет выводить вstdout
, еслиnil
он вернет форматированный вывод в виде строки. Это можно использовать условно на выходе. Приведенный выше пример можно записать так же коротко, как:Если значение было выведено, возвращаемое значение будет
nil
. Из-за этого его также можно использовать как условие завершенияdo
цикла:~[...~]
Условный модуль форматирования использует аргумент и выбирает строку форматирования из списка по индексу. Обычный вариант использования - форматер
~:;
по умолчанию для выбора между нулем и не нулем.Условные средства форматирования также могут быть вложенными, и в этом случае каждый из них будет использовать аргумент по очереди.
~&
В каждом из приведенных выше примеров,
~%
используется для выделения новой строки. В большинстве случаев это можно заменить буквальным переводом строки. Другим вариантом является использование~&
, которое будет испускать новую строку тогда и только тогда, когда выходной курсор находится не в начале строки, иначе afresh-line
.И то
~%
и другое~&
может также принимать аргумент сv
модификатором или в виде константы, и будет производить столько строк перевода. Они также с радостью примут отрицательный аргумент, и в этом случае они ничего не излучают.Внешние ссылки
Практический Common Lisp
18. Несколько рецептов FORMAT
Common Lisp the Language, 2-е издание
22.3.3. Форматированный вывод в символьные потоки
источник