Was ist der beste Weg, um diese Sequenz-Transformation in Clojure zu behandeln?

8

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.

    
eggsyntax 17.11.2011, 12:27
quelle

2 Antworten

12

Idiomatische Clojure neigt dazu, die Sequenzen als Ganzes und nicht als einzelne Elemente zu manipulieren. Sie könnten create-diff-vector auf Englisch als:

definieren

Das Ergebnis ist ein Vektor bestehend aus:

  • eine Null oder das erste Element der Eingabe, abhängig davon, ob start-zero wahr oder falsch ist; gefolgt von
  • Unterschiede zwischen der Eingabesequenz ohne das erste Element und der Eingabesequenz ohne das letzte Element.

Der zweite Teil kann so dargestellt werden: Für die Eingabe (31 41 59 26 53) haben wir

%Vor%

Was, übersetzt in Clojure, bemerkenswert prägnant wird:

%Vor%

Ein paar Punkte zu beachten:

  • Ein Fragezeichen am Ende von start-zero? dient als Hinweis, dass hier ein boolescher Wert erwartet wird.
  • Der Code nutzt die Tatsache, dass map ping eine Funktion über Sequenzen unterschiedlicher Länge am Ende der kürzesten Sequenz endet.
Daniel Janus 17.11.2011, 12:56
quelle
1

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.

    
Christian Berg 17.11.2011 12:45
quelle