Tipps zum Golfen in Lisp


9

Welche allgemeinen Tipps gibt es zum Golfen in Lisp (beliebiger Dialekt)? Bitte posten Sie einen Tipp pro Antwort und nur Antworten, die für einen Lisp-Dialekt spezifisch sind (z. B. "Kommentare entfernen" ist keine Antwort).

Bitte posten Sie den Dialekt von Lisp, für den Ihr Tipp gilt, mit Ihrem Tipp.



1
Stellen Sie sich vor, diese unterscheiden sich von den Tipps zum Golfen in Scheme and Racket ?
Alex A.

1
Ich würde empfehlen, Tinylisp, eine kleinere, abgespeckte Version von Lisp, für Ihr Golfvergnügen zu verwenden.
ckjbgames

Antworten:


4

Ordnen Sie Funktionsparameter an, um Leerzeichen zu minimieren

Anstatt von

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

versuche so etwas wie

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

1

Drucken Sie Zeichenfolgen, die aus Großbuchstaben bestehen, über Druckatome

Die princFunktion in Common Lisp ist kurz und druckt Objekte ohne Escapezeichen. Wenn Sie Common Lisp-Symbole drucken, die die Synax haben 'symbol-name, müssen Sie keine Anführungszeichen für das , was Sie drucken möchten, und Sie können auch Leerzeichen sparen. Beachten Sie, dass beim Drucken von Symbolen diese großgeschrieben werden. Außerdem wird weder eine neue Zeile noch ein Leerzeichen hinzugefügt, sodass keine Verkettung erforderlich ist.

Beispielsweise,

(princ'hai)

wird gedruckt HAI.

Und

(princ'hai)(princ(read))

druckt HAI, fragt nach Eingabe und druckt sie wieder aus, z. B. wenn Sie Hallo eingeben, ist das Ergebnis

HAIhellohello

1

Verwenden Sie 1+und 1-zum Inkrementieren und Dekrementieren

Anstelle von (+ a 1)oder (- b 1)versuchen (1+ a)oder (1- b).


Ich verstehe das nicht Wird nicht 1+als zwei Token analysiert, 1und +? Ich dachte es wäre +1.
Esolanging Fruit

@ Challenger5 1+und 1-werden als ein einzelnes Token analysiert Common Lisp HyperSpec Function 1+, 1-
Ceiletcat

Ich dachte, dass Namen nicht mit Ziffern beginnen können?
Esolanging Fruit

@EsolangingFruit das ist Lisp ...
Nur ASCII

1

Verwenden Sie loopund format, wie printfbei Steroiden. formatEnthält Iterationen und Bedingungen sowie römische Ziffern, englische Zahlen und englische Pluralformen. Es ist sehr, sehr hässlich und sehr kompakt.


1

Bedingte Ausgabe

GNU Common Lisp

~v^

Die Up-and-Out- Direktive ~^wird am häufigsten in einer Listenformatierungsoperation verwendet, um nach dem letzten Listenelement zu beenden. Es kann jedoch auch mit einem vModifikator verwendet werden, um ein Argument zu verwenden. In diesem Fall wird es beendet, wenn dieses Argument Null ist. Dies ist besonders nützlich für den Umgang mit der von erzeugten Null 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)

Das erste Argument formatkann eine der folgenden sein t, nilaka (), oder ein Strom. Wenn es übergeben wird t, wird es an ausgegeben stdout, wenn nildie formatierte Ausgabe als Zeichenfolge zurückgegeben wird. Dies kann bedingt ausgegeben werden. Das obige Beispiel könnte genauso kurz geschrieben werden wie:

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

Wenn ein Wert ausgegeben wurde, ist der Rückgabewert nil. Aus diesem Grund kann es auch als Abschlussbedingung für eine doSchleife verwendet werden:

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

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

~[...~]

Der bedingte Formatierer verwendet ein Argument und wählt eine Formatierungszeichenfolge aus einer Liste nach Index aus. Ein häufiger Anwendungsfall ist die ~:;Auswahl des Standardformatierers zwischen Null und nicht Null.

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

Bedingte Formatierer können auch verschachtelt werden. In diesem Fall verbraucht jeder nacheinander ein Argument.


~&

In jedem der obigen Beispiele ~%wird eine neue Zeile ausgegeben. In den meisten Fällen könnte dies durch einen wörtlichen Zeilenumbruch ersetzt werden. Eine andere Option ist die Verwendung ~&, die genau dann eine neue Zeile ausgibt, wenn sich der Ausgabecursor nicht am Anfang einer Zeile befindet, auch bekannt als a fresh-line.

Beide ~%und ~&können auch ein Argument mit einem vModifikator oder als Konstante annehmen und werden so viele Zeilenumbrüche erzeugen. Sie werden auch beide gerne ein negatives Argument akzeptieren. In diesem Fall geben sie nichts ab.


Externe Referenzen

Praktisches Common Lisp
18. Einige FORMAT-Rezepte

Common Lisp the Language, 2. Auflage
22.3.3. Formatierte Ausgabe in Zeichenströme

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.