Common Lisp был определен таким образом, чтобы его можно было эффективно реализовать на самых разных аппаратных и программных системах. Примерами являются такие процессоры, как Motorola 68000/20/30/40, различные процессоры Intel x86, процессоры на основе стека Lisp Machine, процессоры DEC VAX, RISC, суперкомпьютеры, подобные тем, что принадлежат Cray. В 80-х годах было много конкурирующих семейств процессоров, включая процессоры, разработанные для выполнения кода на Лиспе. Сегодня у нас все еще есть несколько семейств процессоров (x86, x86-64, ARM, SPARC, POWER, PowerPC, ...).
Он также может быть скомпилирован в C, Scheme или другие языки программирования.
Он также может быть скомпилирован с виртуальными машинами, такими как CMUCL, CLISP или виртуальная машина JVM / Java (кажется, что виртуальная машина Java имеет ограничение в 254 аргумента).
Например, компилятор Common Lisp может компилировать код Lisp в простой C-код. Таким образом, было бы хорошо, если бы максимально возможное количество вызовов функций компилятора C могло быть использовано повторно. Особенно для упрощения вызова Lisp из C.
C / C ++ также имеет ограничения на это:
Максимальное количество параметров в объявлении функции
Выше приведены числа, такие как 127 (C) и 256 для C ++. Так что для компилятора Lisp to C это могут быть ограничения. В противном случае код Лисп не будет использовать вызов функции C.
Первый такой компилятор KCL (Kyoto Common Lisp, позже эта реализация превратилась в GCL / GNU Common Lisp и ECL / Embeddable Common Lisp) имел CALL-ARGUMENTS-LIMIT
64.
Например, 64-битная реализация LispWorks / Mac OS X имеет значение 2047 для CALL-ARGUMENTS-LIMIT
.
CALL-ARGUMENTS-LIMIT
должно быть не меньше 50.
Таким образом, в Common Lisp обработка списка и аргументы вызова не связаны. Если вы хотите обрабатывать списки, вы должны использовать инструменты обработки списков (LIST, MAPCAR, APPEND, REDUCE, ...). Common Lisp предоставляет механизм для доступа к аргументам в виде списка с использованием параметра &REST
. Но этого, как правило, следует избегать, поскольку это может привести к накладным расходам на вызов функции, поскольку список аргументов должен быть обработан.