Как анализировать неизвестный код Common Lisp с помощью sbcl и slime

#debugging #common-lisp #sbcl

#отладка #common-lisp #sbcl

Вопрос:

Как проанализировать неизвестный исходный код Common lisp, чтобы понять его?

Учитывая, у меня есть исходный код функции на Common Lisp. Эта воображаемая функция работает с произвольными и сложными данными. Теперь я хотел бы проанализировать такую функцию.

Итак, я заинтересован в рабочих методах анализа некоторого заданного исходного кода common lisp. Т.е. Путем пошагового просмотра исходного кода, как это можно сделать с исходным кодом elisp в Emacs с помощью edebug-defun .
Моими инструментами являются slime, sbcl и Emacs.

Конец фактического вопроса, приведенные ниже сведения написаны только для того, чтобы дать лучшее представление о том, о чем идет речь в этом вопросе.


Примечания по вопросам предыстории:

  • Меня не интересует, что делает приведенная выше функция, поскольку
  • Я уже знаю основы common lisp, такие как if , dolist , defun и основы. Кроме того, я также знаю, как запрашивать CLHS.
  • Вероятно, я мог бы просмотреть код и данные с помощью ручки и бумаги, но зачем? Когда я сижу перед компьютером.
  • Я уже прочитал CL Cookbook — Руководство по отладке и отладке Malispers

Вот пример такой функции, ответ не обязательно должен ссылаться на эту функцию:

 (defun wins (grid color)
  (declare (optimize (speed 0)
                     (debug 3)))
  (dolist (phase *phase*)
    (dolist (start (car phase))
      (if (= (* 4 color)
             (reduce #'  (cadr phase)
                     :key
                     (lambda (offset)
                       (aref grid (  start offset)))))
        (return-from wins t)))))
 

Учитывая приведенный выше код, для меня остается загадкой, когда какие части произвольных данных обрабатываются и как. Вероятно, было бы полезно увидеть это в действии.

В этом специальном примере я пытался использовать (step (wins ...)) , но это останавливается только на (* 4 color) , (reduce ... и (* start offset) , чего недостаточно (для меня) для понимания функции.

Также (trace wins) не очень помогло.

Я взял эту функцию из учебника по common lisp, в котором она уже объясняется. Поэтому нет необходимости объяснять эту функцию.

Комментарии:

1. ммм … ваш вопрос больше подходит для reddit / r / common_lisp или другого форума.

2. Вы можете искать документацию символов и функций программно с documentation помощью .

3. @Ehvince почему я должен искать документацию, когда ее не существует, и я хочу знать, как функция обрабатывает данные?

4. Foreign common lisp code также может означать код lisp, который имеет дело с взаимодействием с другими языками. common-lisp.net/project/cffi . Я предлагаю использовать фразу «Неизвестный код», а не иностранный.