не могу понять определение row-major-ref в sbcl

Определение взято из src/code/array.lisp sbcl. Похоже на бесконечный цикл? Я не нашел никакой подсказки, чтобы получить это. Любой намек? Благодарю вас!

(defun row-major-aref (array index)                                                  |
  #!+sb-doc                                                                          |
  "Return the element of array corressponding to the row-major index. This is        |
   SETF'able."                                                                       |
  (declare (optimize (safety 1)))                                                    |
  (row-major-aref array index))       

person user3185284    schedule 04.02.2014    source источник


Ответы (1)


В src/compiler/array-tran.lisp вы также можете найти этот код:

(deftransform row-major-aref ((array index))
  `(hairy-data-vector-ref array
                          (%check-bound array (array-total-size array) index)))

Я не эксперт по внутренностям SBCL, но предполагаю, что row-major-aref рассматривается компилятором как "базовая" операция, которая не сводится к другим вызовам функций Лиспа, а скорее преобразуется в машинный код.

person Vsevolod Dyomkin    schedule 04.02.2014
comment
Одним из способов являются так называемые VirtualOPerations, которые предоставляют ассемблерные реализации для вызовов функций, которые используются для вызовов с определенными фиксированными типами аргументов. Они находятся в компиляторе/‹target›/ как DEFINE-VOP вызовы макросов со свойством :translate. Это свойство указывает, какую функцию они реализуют (для определенных типов аргументов). - person Philipp Matthias Schäfer; 05.02.2014