Lispy Dialekte mit guter mehrdimensionaler Array-Programmierung

8

Gibt es Lisp- oder Schema-Dialekte, die eine gute Unterstützung für Array- und lineare algebraische Manipulationen bieten? Mit guter Unterstützung meine ich nicht Schnittstellen zu BLAS / LAPACk, sondern effiziente Array-Primitive in der Sprache selbst. Ich würde es als effizient betrachten, wenn es sich beispielsweise gegen Numpy behaupten kann. Ich habe gehört, dass Stalin sehr schnell ist, aber ich bin neu im Lispeln und nicht mit der syntaktisch bequemen Manipulation und effizienten Darstellung von Multi-D-Arrays in solchen Sprachen vertraut. Pointer (kein Wortspiel beabsichtigt) wird sehr geschätzt werden, besonders wenn sie mit persönlichen Erfahrungen unterstützt werden.

    
san 15.07.2011, 02:54
quelle

3 Antworten

12

Arrays im Standard-Common Lisp können mehrdimensional sein.

Das Array-Verzeichnis beschreibt die verfügbaren Operationen.

%Vor%

Bei der Arbeit mit Arrays kann es nützlich sein, eine andere Eigenschaft von Common Lisp zu verwenden: type-Deklarationen und Compiler-Optimierungen. Common Lisp ermöglicht das Schreiben von generischem Code ohne Deklaration von Typen. Aber in kritischen Abschnitten kann man Typen für Variablen, Parameter, Rückgabewerte usw. deklarieren. Man kann dann den Compiler anweisen, einige Überprüfungen zu entfernen oder typspezifische Operationen zu verwenden. Die Höhe der Unterstützung hängt vom Compiler ab. Es gibt anspruchsvollere Compiler wie SBCL, LispWorks und Allegro CL, die eine Vielzahl von Optimierungen unterstützen. Einige Compiler geben auch große Mengen an Kompilierungsinformationen.

Ein letzter Ausweg besteht darin, eine Foreign Function Interface (FFI) zu verwenden, um C-Code aufzurufen oder Inline-Assembler zu verwenden (was von einigen Compilern unterstützt wird).

Common Lisp hat standardmäßig das LOOP-Makro im Standard. Es erlaubt die typischen imperativen Schleifenkonstrukte auszudrücken. Es gibt auch eine Alternative, das ITERATE -Makro - es kann einige Vorteile für mehrdimensionale Arrays haben.

Beachten Sie auch, dass Lisp-Arrays einige ungewöhnliche Funktionen wie verschobene Arrays haben. Diese verwenden den Speicher eines anderen Arrays, können jedoch ein anderes dimensionales Layout haben.

Manchmal ist es auch nützlich, spezielle Makros zu schreiben, die das Vorkommen von Arrays verbergen. Ohne diesen Lisp-Code mit Typdeklarationen können mehrdimensionale Arrays und LOOP ein wenig groß sein. Ein Beispiel für einen typischen Code, der keine speziellen linguistischen Abstraktionen verwendet, finden Sie hier: fft.lisp .

Spezielle Verwendung von SIMD-Anweisungen oder anderen Formen der Datenparallelität werden von Common-Lisp-Compilern normalerweise nicht bereitgestellt. Ausnahmen können existieren.

    
Rainer Joswig 15.07.2011, 09:45
quelle
4

Haben Sie Clojure mit der Incanter -Bibliothek in Betracht gezogen? Es hat eine gute Unterstützung für Matrizen und hat einen sehr hohen Qualitätscode für andere Dinge wie Graphen, mathematische Funktionen, Statistiken und mehr. Es hat auch eine gute Unterstützung für die Parallelität.

    
clartaq 15.07.2011 14:16
quelle
3

Racket (früher PLT-Schema) hat kürzlich schöne mehrdimensionale Arrays ( math/array ) bekommen . Sie scheinen von Python NumPy und Data Parallel Haskell inspiriert zu sein. Einige wichtige Funktionen, die Ihnen gefallen könnten:

  • wahre N-dimensionale hyperrektanguläre Form
  • Broadcasting (punktweise Operation auf einem oder mehreren Arrays, wie UFuncs in NumPy, aber flexibler)
  • schneiden, transformieren und umformen (auf Augenhöhe mit NumPy)
  • array comprehensions
  • teilweise und vollständige Reduktionen (Falten)
  • optionale Mutabilität (veränderbare Arrays erlauben explizites array-set! )
  • optionale Faulheit (Arrays sind standardmäßig voreingestellt)
  • optionale Eingabe (erforderlich für schnellen Code)

Das ist für Array-Primitive. Sie spielen auch gut mit math/matrix .

%Vor%

math/array scheint ein guter Grund dafür zu sein, Schlage Racket für praktische Aufgaben zu überdenken.

    
sastanin 11.04.2013 10:10
quelle