Поради щодо гольфу в Ліспі


9

Які загальні поради щодо гольфу в Ліспі (будь-який діалект)? Будь ласка, опублікуйте по одній підказці на відповідь, і лише відповіді, характерні для діалекту Lisp (наприклад, "видалити коментарі" - це не відповідь).

Будь ласка, опублікуйте діалект Lisp, який стосується вашої підказки, стосується вашої поради.



1
Ви думаєте, що вони будуть відрізнятися від підказок щодо гольфу в схемі та ракетці ?
Олексій А.

1
Я б радив використовувати тинілісп, меншу, збиту версію Lisp, для задоволення від гольфу.
ckjbgames

Відповіді:


4

Упорядкувати параметри функції, щоб мінімізувати пробіл

Замість

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

спробуйте щось подібне

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

1

Друкуйте рядки, що складаються з великих літер за допомогою атомів друку

princФункція Common Lisp коротка, і буде друкувати об'єкти без втечі characers. Якщо ви друкуєте загальні символи Lisp, які мають синаксис 'symbol-name, це позбавить вас від необхідності лапок навколо того, що ви хочете надрукувати, а також може заощадити на пробілі. Зауважте, що при друку символів вони будуть написані з великої літери. Крім того, він не додає нову лінію чи пробіл, тому вам не потрібно конкатенація.

Наприклад,

(princ'hai)

надрукує HAI.

І

(princ'hai)(princ(read))

буде друкувати HAI, запитувати введення та виводити його назад, наприклад, якщо ви набираєте привіт, результат є

HAIhellohello

1

Використовуйте 1+і 1-для збільшення та зменшення

Замість (+ a 1)або (- b 1)спробуйте (1+ a)або (1- b).


Я цього не розумію. Чи не 1+розбирається як два лексеми, 1і +? Я думав, що так +1.
Esolanging Fruit

@ Challenger5 1+і розбираються1- як єдиний маркер Загальна функція Lisp HyperSpec 1+, 1-
roofcat

Я думав, що імена не можуть починатися з цифр?
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, nilвін же (), або потік. Якщо передано 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))

Також можуть бути вкладені умовні форматори, і кожен з них по черзі буде використовувати аргумент.


~&

У кожному з наведених вище прикладів ~%використовується випромінювання нового рядка. У більшості випадків це може бути замінено буквальним новим рядком. Іншим варіантом є використання ~&, яке випромінює новий рядок, якщо і тільки якщо курсор виводу не знаходиться на початку рядка, він жеfresh-line .

І те, ~%і ~&також може взяти аргумент, з vмодифікатором або як константа, і дасть стільки нових рядків. Вони також із задоволенням приймуть негативний аргумент, і в цьому випадку нічого не випромінюють.


Зовнішні посилання

Практичний звичайний ліс
18. Невеликі рецепти ФОРМАТУВАННЯ

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.