Как посмотреть lisp-код стандартных функций?
Формулировка задачи:
Нужен просмотр кода стандартных функций
В связи с плохим знаниям английского языка, мне, иной раз, проще глянуть код функции на лиспе, чем читать её описание. В homelisp это сделать легко:
А, вот, как действовать для других реализаций Lisp`а я не знаю. Но, должно же быть что-то, хотелось бы.
(getd 'length) ==> (EXPR (x) (COND ((ATOM x) 0) (T (PLUS 1 (length (CDR x))))))
Решение задачи: «Как посмотреть 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."))
Объяснение кода листинга программы
В данном коде реализованы две функции для вычисления длины последовательности.
- Функция
length
реализована с помощью комбинации других функций.seq-dispatch-checking
выполняет проверку типа последовательности и выбирает подходящий метод вычисления длины.length
рекурсивно вызывает себя для списка или вектора, перебирая каждый элемент до достижения конца.sb!sequence:length
вызывается для последовательности, которая реализует последовательность.- Если последовательность не реализует последовательность, то вызывается
sequence::protocol-unimplemented
, чтобы сигнализировать об ошибке.
- Функция
sequence:length
определена как общая функция с несколькими методами.- Два метода определены для списка и вектора соответственно, которые просто вызывают функцию
length
. - Третий метод определен для последовательности, который вызывает
sequence::protocol-unimplemented
, чтобы сигнализировать об ошибке, если последовательность не реализует последовательность. Код не завершен, так как после определения функцииsequence:length
идет неявный вызов этой функции с аргументомT
, который является объектом классаSEQUENCE
. Однако, так как функцияsequence::protocol-unimplemented
вызывается для объекта, который не реализует последовательность, код не будет работать корректно.
- Два метода определены для списка и вектора соответственно, которые просто вызывают функцию
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д