Как просмотреть список определенных функций из Common Lisp REPL prompt
Я оцениваю/тестирую приложение на основе браузера, предположительно написанное общим lisp. Помимо интерфейса на основе браузера, программное обеспечение предоставляет окно "прослушиватель" с запросом "CL-User > " REPL.
Я хочу просмотреть список функций, символов и пакетов из приглашения REPL. Чтобы я мог связать функциональность frontend с тем, что отображается через REPL.
Поиск Google для меня бесполезен, так как он приводит к учебным материалам и ресурсам, которые преподают шаг за шагом lisp.
Любые подсказки, указатели на изучение состояния через REPL будут оценены.
Ответы
Ответ 1
Если вы не знаете, какие символы вы ищете, но знаете, какие пакеты вы хотите искать, вы можете значительно уменьшить объем поиска, который вам нужно сделать, только перечисляя символы из этих конкретных пакетов:
(defun get-all-symbols (&optional package)
(let ((lst ())
(package (find-package package)))
(do-all-symbols (s lst)
(when (fboundp s)
(if package
(when (eql (symbol-package s) package)
(push s lst))
(push s lst))))
lst))
(get-all-symbols 'sb-thread) ; returns all the symbols in the SB-THREAD package
Линия (get-all-symbols 'sb-thread)
делает именно это.
Если у вас есть представление о том, какие типы символов вы ищете, и хотите угадать их имена, вы можете сделать это
(apropos-list "mapc-") ; returns (SB-KERNEL:MAPC-MEMBER-TYPE-MEMBERS SB-PROFILE::MAPC-ON-NAMED-FUNS)
(apropos-list "map" 'cl) ; returns (MAP MAP-INTO MAPC MAPCAN MAPCAR MAPCON MAPHASH MAPL MAPLIST)
(apropos-list)
возвращает все символы, имя которых содержит строку, в которую вы проходите, и берет необязательный пакет для поиска.
Чтобы понять, что делают все эти символы, попробуйте следующее: http://www.psg.com/~dlamkins/sl/chapter10.html
Ответ 2
Чтобы перечислить все пакеты (duh):
(list-all-packages)
Чтобы найти функции, экспортированные из определенного пакета:
(loop for x being the external-symbol of "CL" when (fboundp x) collect x)
Ответ 3
Чтобы перечислить все:
(apropos "")
Чтобы перечислить все из определенного пакета, добавьте 'project-name:
(apropos "" 'quickproject)
Ответ 4
(let ((lst ()))
(do-all-symbols (s lst)
(when (fboundp s) (push s lst)))
lst)
Довольно много принято как-из здесь.
Ответ 5
Возможно, что-то вроде этого:
(defun get-symbols-in-package (&optional (package *package*))
(let ((lst ()))
(do-symbols (s package)
(push s lst))
lst))
Использовать как (get-symbols-in-package)
или (get-symbols-in-package 'foo)
...