Ищу программу, которая может помочь мне сгенерировать для lisp-программы строки кода на статистику функций.

Я ищу программу, которая может генерировать для меня статистику строк кода для каждой функции в программе на Лиспе. В Лиспе это означает, что для каждой функции или макроса нужно подсчитать, сколько функций рекурсивно включено в функцию верхнего уровня.

Любой указатель будет высоко оценен.


person user2193970    schedule 15.01.2018    source источник
comment
Был статический анализатор под названием Xref. Возможно, он даже включен в SLIME... См.: cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/lisp/code/tools/ Не знаю, существует ли более новая его версия.   -  person Rainer Joswig    schedule 16.01.2018


Ответы (1)


для каждой функции или макроса, чтобы подсчитать, сколько функций рекурсивно включены в функцию верхнего уровня

Я не уверен, что это значит.

Если вы хотите подсчитать количество вызовов функций в коде, вам потребуется полноценный обходчик кода.

Однако для простого смысла количества форм верхнего уровня в файле проблема вполне разрешима. Я не знаю о существующей программе, которая делает это, но это не кажется сложным:

(defun read-file-as-string (file-name)
  (with-open-file (in file-name :external-format charset:iso-8859-1)
    (let ((ret (make-string (1- (file-length in)))))
      (read-sequence ret in)
      ret)))

:external-format может и не понадобиться. Видеть

.

(defun count-lines (string)
  (count #\Newline string))

См. count.

(defun count-forms (string)
  (with-input-from-string (in string)
    (loop with *read-suppress* = t
      until (eq in (read in nil in))
      count t)))

Видеть

  • with-input-from-string
  • *read-suppress*, который необходим для read для работы с файлом с пакетами, которых в данный момент нет в этом образе.

.

(defun file-code-stats (file-name)
  (let* ((file-text (read-file-as-string file-name))
         (lines (count-lines file-text))
         (forms (count-forms file-text)))
    (format t "File ~S contains ~:D characters, ~:D lines, ~:D forms (~,2F lines per form)"
            file-name (length file-text) lines forms (/ lines forms))
    (values (length file-text) lines forms)))



(file-code-stats "~/lisp/scratch.lisp")
File "~/lisp/scratch.lisp" contains 133,221 characters, 3,728 lines, 654 forms (5.70 lines per form)
133221 ;
3728 ;
654
person sds    schedule 15.01.2018