Jakie masz ogólne wskazówki na temat gry w golfa w Racket / Scheme ? Szukam pomysłów, które można by zastosować do ogólnych problemów z golfem, które są przynajmniej nieco specyficzne dla Racket / Scheme (np. „Usuń komentarze” nie jest odpowiedzią).
Wiem, że Scheme i Racket (wcześniej PLT Scheme) są technicznie różnymi językami, ale są dość podobne pod wieloma względami i wiele kodu (podejrzewam) będzie działało głównie zgodnie z przeznaczeniem w obu. Jeśli wskazówka dotyczy tylko jednego z wyżej wymienionych języków, należy pamiętać o tym.
let
często są implementowane pod względemlambda
.W Racket ,
require
formy może mieć wiele argumentów.Jest o wiele krótszy niż
Nie wiem dużo o Schemacie , ale wydaje się, że nie ma on
require
wbudowanego.źródło
Używaj krótszych synonimów
W Racket istnieje wiele procedur, które mają w większości równoważne krótsze wersje. (Zwykle nie są równoważne: na przykład
(car (cons 1 2))
działa tam , gdzie(first (cons 1 2))
zawodzi. Ale możesz dokonać zamiany, jeśli wiesz, że w twoim przypadku są to synonimy).Ta lista jest prawdopodobnie niekompletna: prawdopodobnie nie wiem jeszcze o większości rzeczy, które mogłyby się na niej znaleźć.
(= a b)
zamiast(equal? a b)
przy porównywaniu liczb.'(1 2)
zamiast(list 1 2)
.car
,cadr
,cdr
Ofirst
,second
irest
.null?
zamiastempty?
modulo
zamiastremainder
gdy moduł jest dodatni.floor
zamiasttruncate
kiedy jego argument jest pozytywny.źródło
Pomiń niepotrzebne spacje
Można to uznać za „trywialną” wskazówkę, ale trzeba ją gdzieś wskazać.
Za każdym razem, gdy czytasz kod rakiety napisany przez zwykłych ludzi (np. W dokumentacji rakiety ), zostaną wstawione wszystkie spacje: na przykład,
W rzeczywistości, ponieważ
(
i)
nie mogą być częścią nazw zmiennych, możemy usunąć wszystkie spacje wokół nich i nie stracić żadnych dwuznaczności (a co ważniejsze, nadal uzyskać poprawny kod). Zatem powyższym wyrażeniem może być:źródło
Poniższe wskazówki dotyczą rakiety :
Domyślne argumenty
Szczególnie przydatne do tworzenia aliasów dla często używanych długich nazw funkcji.
Załóżmy, że golf pozwala napisać funkcję, która zużywa argument, i zakładamy, że trzeba
reverse
dużo używać . Zaczniesz od czegoś takiego:Zamiast tego możesz wziąć dodatkowy argument o krótszej nazwie niż
reverse
i ustawić jego wartość domyślną nareverse
:Co więcej, jest to przydatne, jeśli masz funkcję pomocniczą, której używasz w wielu miejscach z tymi samymi argumentami. Pamiętaj, aby w razie potrzeby zmienić kolejność argumentów funkcji, aby można było użyć jak największej liczby argumentów domyślnych i usunąć argumenty z wielu stron wywoławczych.
match
Ten jest nieco trudniejszy do streszczenia w małym poście, więc przeczytaj go w Dokumentach dotyczących rakiet . W skrócie,
match
pozwala wyodrębnić elementy i sekwencje elementów w określonej kolejności z listy, a quasi-cytatowa składnia pozwala ponownie połączyć okaleczoną listę:Zapewnia również łatwy sposób pracy z wyrażeniami regularnymi i późniejszego obliczania grup wynikowych,
O imieniu
let
Zobacz nazwaną składnię tutaj .
let proc-id ...
Pozwala to na pisanie funkcji rekurencyjnych, które są wywoływane natychmiast bez
define
lub faktycznie wywołują funkcję po jej zdefiniowaniu.Coś jak:
można skrócić do:
Ta ostatnia jest głupia, ale jak dotąd nigdzie nie byłem w stanie użyć tej małej sztuczki:
(apply map list matrix)
transponujęmatrix
, gdziematrix
jest jakaś prostokątna lista list'((1 2 3) (a b c))
.Daj mi znać, jeśli okaże się to przydatne.
źródło
Jak wskazała Winny ,
#!
zwykle można użyć zamiast tego#lang
, oszczędzając cztery bajty.źródło