Ich bin neu bei Clojure und habe einige Datenmanipulationsarbeiten, die ich kürzlich gemacht habe, als Lernhilfe übersetzt. Ich habe eine Funktion Übersetzung, die gut funktioniert, und ist kürzer, aber fühlt sich viel weniger lesbar. Kann jemand eine besser lesbare und / oder idiomatische Art vorschlagen, damit umzugehen?
In Python:
%Vor%Mein Versuch einer Clojure-Übersetzung:
%Vor%Es könnte sein, dass es wegen meiner Unerfahrenheit mit Clojure weniger lesbar ist, aber vor allem fühlt sich der Trick, einem Eingangsvektor ein Element voranzustellen, so an, als ob es die Absicht verdunkelt. Alle Lösungen, die ich ausprobierte, waren nicht viel länger und hässlicher.
Viele Sequenztransformationen sind in Clojure unglaublich elegant, aber diejenigen, die ich bisher als schwierig empfinde, sind solche wie diese, die a) sich eher nach Index als nach Element manipulieren lassen und / oder b) eine spezielle Handhabung erfordern bestimmte Elemente.
Danke für Anregungen.
Idiomatische Clojure neigt dazu, die Sequenzen als Ganzes und nicht als einzelne Elemente zu manipulieren. Sie könnten create-diff-vector
auf Englisch als:
Das Ergebnis ist ein Vektor bestehend aus:
start-zero
wahr oder falsch ist; gefolgt von Der zweite Teil kann so dargestellt werden: Für die Eingabe (31 41 59 26 53)
haben wir
Was, übersetzt in Clojure, bemerkenswert prägnant wird:
%Vor%Ein paar Punkte zu beachten:
start-zero?
dient als Hinweis, dass hier ein boolescher Wert erwartet wird. map
ping eine Funktion über Sequenzen unterschiedlicher Länge am Ende der kürzesten Sequenz endet. Diese Implementierung wäre idiomatischer:
%Vor% Zuerst gebe ich entweder den ersten Wert des Vektors oder 0 dem Eingabevektor vor. Dann verwende ich map
, um den Vektor von sich selbst zu subtrahieren, verschoben um eine Position.
Tags und Links clojure functional-programming