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

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

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

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

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

textual
Листинг программы
  1. (defun length (sequence)
  2.   #!+sb-doc "Return an integer that is the length of SEQUENCE."
  3.   (declare (explicit-check))
  4.   (seq-dispatch-checking sequence
  5.                 (length sequence)
  6.                 (length sequence)
  7.                 (sb!sequence:length sequence)))
  8.  
  9. ;;;;;;;;;;;;;;;;;;;;
  10.  
  11. (in-package "SB-IMPL")
  12. ...
  13. (defgeneric sequence:length (sequence)
  14.   (:method ((s list)) (length s))
  15.   (:method ((s vector)) (length s))
  16.   (:method ((s sequence)) (sequence::protocol-unimplemented s))
  17.   #+sb-doc
  18.   (:documentation
  19.    "Returns the length of SEQUENCE or signals a PROTOCOL-UNIMPLEMENTED
  20.   error if the sequence protocol is not implemented for the class of
  21.   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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут