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.
Es kann auch in virtuelle Maschinen wie die von CMUCL, CLISP oder der JVM/Java Virtual Machine kompiliert werden (Die Java Virtual Machine scheint ein Limit von 254 Argumenten zu haben).
Zum Beispiel könnte ein Common Lisp-Compiler Lisp-Code zu geradlinigem 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 Grenzen auf, dass auch:
Maximum number of parameters in function declaration
Above gibt Zahlen wie 127 (C) und 256 für C++. Für einen Lisp-zu-C-Compiler könnten das die Grenzen sein. Andernfalls würde der Lisp-Code nicht die C-Funktion aufrufen.
Die erste Compiler KCL (Kyoto Common Lisp, später diese Implementierung in GCL/GNU Common Lisp und ECL/Fähiges Common Lisp entwickelt) hatte eine CALL-ARGUMENTS-LIMIT
von 64
Eine 64-Bit-Implementierung von LispWorks/Mac OS X hat zum Beispiel einen Wert von 2047 für CALL-ARGUMENTS-LIMIT
.
CALL-ARGUMENTS-LIMIT
sollte nicht kleiner als 50
So in Common Lisp, Listenverarbeitung und Aufruf Argumente sind 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 in der Regel vermieden werden, da dies zu Funktionsaufrufen führen kann, da eine Liste der Argumente konfligiert werden muss.
Das ist, was die Spezifikation sagt, aber wissen Sie von Implementierungen, die tatsächlich ein Limit erzwingen? – Marcin
@Marcin Nun, SBCL garantiert Ihnen eine CALL-ARGUMENTS-LIMIT in der Region von 10^18 und ich würde erwarten, dass mehr Argumente übergeben, dass das einfach nicht funktionieren würde. Ich habe keine anderen Implementierungen trivial zur Hand, aber ich erinnere mich daran, über Leute gelesen zu haben, die Probleme mit APPLY anstelle von REDUCE mit so kurzen Listen wie "in Hunderten von Elementen" haben. – Vatine
@Vatine Ich habe gerade festgestellt, dass mein Titel und meine Fragebeschreibung sich in ihrer beabsichtigten Bedeutung widersprechen. Da ich denke, dass Sie das Wertlimit der Funktion "+" beantworten, können Sie das Limit von _inputs, das die Funktion haben kann, kommentieren? Entschuldigung für die Verwirrung! – Soyuz