Welche allgemeinen Tipps haben Sie zum Golfen in Racket / Scheme ? Ich bin auf der Suche nach Ideen, die generell auf Code-Golf-Probleme angewendet werden können, die zumindest etwas spezifisch für Racket / Scheme sind (z. B. "Kommentare entfernen" ist keine Antwort).
Ich bin mir bewusst, dass Schema und Racket (früher PLT-Schema) technisch unterschiedliche Sprachen sind, sich jedoch in vielerlei Hinsicht sehr ähnlich sind und dass viel Code (ich vermute) in beiden Fällen meistens wie vorgesehen ausgeführt wird. Wenn Ihr Tipp nur für eine der oben genannten Sprachen gilt, beachten Sie dies als solche.
let
häufig in Bezug auf implementiert werdenlambda
.In Racket können
require
Formulare mehrere Argumente enthalten.Ist viel kürzer als
Ich weiß nicht viel über Schema , aber es scheint kein
require
eingebautes zu haben .quelle
Verwenden Sie kürzere Synonyme
Es gibt eine Reihe von Prozeduren in Racket, die meistens äquivalente kürzere Versionen haben. (Sie sind normalerweise nicht gleichwertig: Funktioniert beispielsweise dort,
(car (cons 1 2))
wo(first (cons 1 2))
Fehler auftreten. Sie können die Substitution jedoch vornehmen, wenn Sie wissen, dass sie in Ihrem Fall Synonyme sind.)Diese Liste ist wahrscheinlich unvollständig: Ich weiß wahrscheinlich noch nichts über die meisten Dinge, die in dieser Liste enthalten sein könnten.
(= a b)
anstatt(equal? a b)
beim Vergleichen von Zahlen.'(1 2)
statt(list 1 2)
.car
,cadr
,cdr
Fürfirst
,second
, undrest
.null?
Anstatt vonempty?
modulo
stattremainder
wenn der Modul positiv ist.floor
statttruncate
wenn sein Argument positiv ist.quelle
Lass unnötige Leerzeichen weg
Dies kann als "trivialer" Tipp angesehen werden, auf den man jedoch irgendwo hinweisen muss.
Jedes Mal, wenn Sie den von normalen Leuten geschriebenen Schlägercode lesen (z. B. in der Schlägerdokumentation ), werden alle Leerzeichen eingefügt:
In der Tat, da
(
und)
kann nicht Teil von Variablennamen, können wir alle Räume um sie löschen und nicht verlieren jede Zweideutigkeit (und, was noch wichtiger ist , nach wie vor gültigen Code bekommen). Der obige Ausdruck kann also stattdessen sein:quelle
Die folgenden Tipps gelten für Schläger :
Standardargumente
Besonders nützlich zum Erstellen von Aliasnamen für lange Funktionsnamen, die häufig verwendet werden.
Angenommen, Sie können mit Golf eine Funktion schreiben, die das Argument aufnimmt, und Sie müssen
reverse
viel verwenden. Sie beginnen mit etwas wie:Sie können stattdessen ein zusätzliches Argument mit einem kürzeren Namen als
reverse
eingeben und den Standardwert auf Folgendes festlegenreverse
:Darüber hinaus ist es nützlich, wenn Sie eine Hilfsfunktion haben, die Sie an vielen Stellen mit einigen der gleichen Argumente verwenden. Denken Sie daran, die Argumente für die Funktion nach Bedarf neu anzuordnen, damit Sie so viele Standardargumente wie möglich verwenden und die Argumente von mehreren Aufrufseiten entfernen können.
match
Dieser ist etwas schwieriger in einem kleinen Beitrag zusammenzufassen, lesen Sie die Racket-Dokumentation für diesen.
match
Kurz gesagt: Ermöglicht das Extrahieren von Elementen und Elementsequenzen in einer bestimmten Reihenfolge aus einer Liste. Mit der Quasiquote-Syntax können Sie die verstümmelte Liste wieder zusammenfügen:Außerdem können Sie auf einfache Weise mit regulären Ausdrücken arbeiten und anschließend zusätzliche Berechnungen für die resultierenden Gruppen durchführen.
Genannt
let
Die angegebene Syntax finden Sie hier .
let proc-id ...
Auf diese Weise können Sie rekursive Funktionen schreiben, die sofort aufgerufen werden, ohne
define
die Funktion aufzurufen oder tatsächlich aufzurufen, nachdem Sie sie definiert haben.Etwas wie:
kann gekürzt werden auf:
Letzteres ist albern, aber ich habe diesen kleinen Trick bisher nirgends anwenden können:
(apply map list matrix)
Nimmt eine Transponierung vonmatrix
, womatrix
eine rechteckige Liste von Listen ist, wie'((1 2 3) (a b c))
.Lassen Sie mich wissen, ob dies nützlich ist.
quelle
Wie Winny hervorhob ,
#!
kann in der Regel anstelle von#lang
vier Bytes gespart werden.quelle