In Lisp, wie viele Eingänge kann die + Funktion tatsächlich haben?

7

Ich bin relativ neu bei Lisp und habe mich gefragt, ob es wirklich eine obere Grenze für die "+" Funktion gibt.

(Ich denke, das gilt für alle anderen arithmetischen Funktionen "-", "/" usw.)

    
Soyuz 02.04.2012, 09:40
quelle

5 Antworten

11

Ja, es gibt eine obere Grenze, aber die genaue obere Grenze ist implementierungsabhängig. Du kannst garantiert mindestens 50 Punkte passieren, aber alles hängt davon ab. Wenn Sie eine Liste zusammenfassen müssen, sind Sie wahrscheinlich mit (reduce #'+ list) besser dran. Das sollte Ihnen eine viel bessere Skalierbarkeit geben als jede andere Methode.

Common Lisp HyperSpec hat weitere Informationen.

Wenn es um Wertebereiche geht, gibt es zwei verschiedene Fälle, Floats und Integers. Floats sind von Natur aus durch ihre Größe begrenzt und eine Implementierung, die sich von Single-Floats zu Double-Floats geändert hat, würde mich sehr überraschen. Mit Ganzzahlen und Rationalen wechselt CL nahtlos zwischen Fixnum und Bignum, so dass das Limit eine Funktion des nutzbaren Adressraums ist, der für die Implementierung verfügbar ist. Ich vermute, das gleiche gilt für komplexe Zahlen (komplexe ganze Zahlen und Rationale - gehen Sie zu Bignums, wenn nötig, komplexe Schwimmer - & gt; signalisieren eine außerhalb des Bereichs, oder ein Inf oder NaN zurückgeben).

    
Vatine 02.04.2012, 09:55
quelle
8

Common Lisp wurde so definiert, dass es effizient auf einer Vielzahl von Hardware- und Softwaresystemen implementiert werden kann. Beispiele sind Prozessoren wie das Motorola 68000/20/30/40, die verschiedenen Intel x86-Prozessoren, Stack-basierte Prozessoren von Lisp Machine, DEC VAX, RISC-Prozessoren, Supercomputer wie die von Cray. In den 80er Jahren konkurrierten viele Prozessorfamilien miteinander, darunter Prozessoren, die für die Ausführung von Lisp-Code entwickelt wurden. Heute haben wir noch mehrere Prozessorfamilien (x86, x86-64, ARM, SPARC, POWER, PowerPC, ...).

Es kann auch nach C, Scheme oder anderen Programmiersprachen kompiliert werden.

Er kann auch in virtuelle Maschinen wie CMUCL, CLISP oder JVM / Java Virtual Machine kompiliert werden (Die Java Virtual Machine scheint maximal 254 Argumente zu haben).

Zum Beispiel könnte ein Common-Lisp-Compiler Lisp-Code zum direkten C-Code kompilieren. Daher wäre es gut, wenn so viel von dem Funktionsaufruf des C-Compilers wie möglich wiederverwendet werden könnte. Vor allem auch, um Lisp von C einfacher zu machen.

C / C ++ hat auch Grenzen dafür:

Maximale Anzahl von Parametern in der Funktionserklärung

Oben sind Zahlen wie 127 (C) und 256 für C ++ angegeben. Für einen Lisp-zu-C-Compiler könnten das die Grenzen sein. Andernfalls würde der Lisp-Code nicht die C-Funktion aufrufen.

Der erste solche Compiler-KCL (Kyoto Common Lisp, später wurde diese Implementierung in GCL / GNU Common Lisp und ECL / Embeddable Common Lisp umgewandelt) hatte einen CALL-ARGUMENTS-LIMIT von 64.

Eine 64-Bit-Implementierung von LispWorks / Mac OS X hat beispielsweise einen Wert von 2047 für CALL-ARGUMENTS-LIMIT .

CALL-ARGUMENTS-LIMIT sollte nicht kleiner als 50 sein.

In Common Lisp sind also die Listenverarbeitungs- und Aufrufargumente nicht verwandt. Wenn Sie Listen bearbeiten wollen, müssen Sie die Werkzeuge zur Listenbearbeitung (LIST, MAPCAR, APPEND, REDUCE, ...) verwenden. Common Lisp bietet einen Mechanismus zum Zugriff auf die Argumente als Liste mit einem &REST -Parameter. Dies sollte jedoch normalerweise vermieden werden, da dies zu Funktionsaufrufen führen kann, da eine Liste der Argumente konsentiert werden muss.

    
Rainer Joswig 02.04.2012 13:25
quelle
2

Clojure bietet ein Beispiel für ein Lisp, bei dem Sie über die Verwendung von Lazy Sequences eine unendliche Anzahl von Argumenten für eine Funktion haben können:

%Vor%

Nicht besonders nützlich, natürlich .....

    
mikera 03.04.2012 10:53
quelle
2

Es hängt von der Implementierung ab. "Ich würde vorschlagen, dass LISP-Benutzer 5 Minuten brauchen, um ihre Plattform zu testen".

Für Clojure

%Vor%

Es endet nicht, es hängt bei 8192 bei meinen Einstellungen.

%Vor%     
jwinandy 07.01.2015 04:10
quelle
-1

Einfache Antwort, nein, obwohl eine schlechte Implementierung, die Rekursion und nicht Tail-Rekursion verwendet, ein Stacklimit haben wird.

Abhängig von Ihrer Implementierung + kann rekursiv oder als direkter Funktionsaufruf implementiert werden.

Ich kenne Common Lisp nicht gut genug, um zu wissen, welche Anforderungen es spezifiziert, aber die meisten Implementierungen, wenn sie Rekursion verwenden, verwenden die Tail-Rekursion und vermeiden Stack-Limits.

Ein Funktionsaufruf kann auf die Argumente als Liste zugreifen, so dass die Anzahl der Argumente, die verarbeitet werden können, unbegrenzt ist.

EDIT: Da jemand tatsächlich eine Common Lisp Referenz gegeben hat, sollte es eindeutig eine bessere Antwort sein, aber ich hätte gedacht, dass jede gute Implementierung das Äquivalent von (reduce #'+ arg-list) automatisch anwendet, wenn genug Argumente geliefert werden.

    
Mark Hurd 02.04.2012 09:50
quelle

Tags und Links