Как посмотреть lisp-код стандартных функций?

Узнай цену своей работы

Формулировка задачи:

Нужен просмотр кода стандартных функций В связи с плохим знаниям английского языка, мне, иной раз, проще глянуть код функции на лиспе, чем читать её описание. В homelisp это сделать легко:
(getd 'length)
 
==> (EXPR (x) (COND ((ATOM x) 0) (T (PLUS 1 (length (CDR x))))))
А, вот, как действовать для других реализаций Lisp`а я не знаю. Но, должно же быть что-то, хотелось бы.

Решение задачи: «Как посмотреть lisp-код стандартных функций?»

textual
Листинг программы
(defun length (sequence)
  #!+sb-doc "Return an integer that is the length of SEQUENCE."
  (declare (explicit-check))
  (seq-dispatch-checking sequence
                (length sequence)
                (length sequence)
                (sb!sequence:length sequence)))
 
;;;;;;;;;;;;;;;;;;;;
 
(in-package "SB-IMPL")
...
(defgeneric sequence:length (sequence)
  (:method ((s list)) (length s))
  (:method ((s vector)) (length s))
  (:method ((s sequence)) (sequence::protocol-unimplemented s))
  #+sb-doc
  (:documentation
   "Returns the length of SEQUENCE or signals a PROTOCOL-UNIMPLEMENTED
   error if the sequence protocol is not implemented for the class of
   SEQUENCE."))

Объяснение кода листинга программы

В данном коде реализованы две функции для вычисления длины последовательности.

  1. Функция length реализована с помощью комбинации других функций.
    • seq-dispatch-checking выполняет проверку типа последовательности и выбирает подходящий метод вычисления длины.
    • length рекурсивно вызывает себя для списка или вектора, перебирая каждый элемент до достижения конца.
    • sb!sequence:length вызывается для последовательности, которая реализует последовательность.
    • Если последовательность не реализует последовательность, то вызывается sequence::protocol-unimplemented, чтобы сигнализировать об ошибке.
  2. Функция sequence:length определена как общая функция с несколькими методами.
    • Два метода определены для списка и вектора соответственно, которые просто вызывают функцию length.
    • Третий метод определен для последовательности, который вызывает sequence::protocol-unimplemented, чтобы сигнализировать об ошибке, если последовательность не реализует последовательность. Код не завершен, так как после определения функции sequence:length идет неявный вызов этой функции с аргументом T, который является объектом класса SEQUENCE. Однако, так как функция sequence::protocol-unimplemented вызывается для объекта, который не реализует последовательность, код не будет работать корректно.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.6 из 5