src/middleware/documentation.lisp @ cfbc5d205fbd
Add in-package option for `eval`
| author | Steve Losh <steve@stevelosh.com> | 
|---|---|
| date | Sat, 02 Jul 2016 17:20:41 +0000 | 
| parents | b806d22cf665 | 
| children | 60462d4304de | 
(in-package #:nrepl) (defun lambda-list-to-string (l) "Return a single-line string of the lambda list." (if (listp l) (format nil "(~{~A~^ ~})" (mapcar #'lambda-list-to-string l)) (princ-to-string l))) (defun find-lambda-list (s) "Return the lambda list for the given symbol. Will return `nil` if none is found. A second value is returned to indicate whether it was found. " (if (fboundp s) (values #+sbcl (sb-introspect:function-lambda-list s) #+ccl (ccl:arglist s) t) (values nil nil))) (defun find-symbol-harder (name) "Return the symbol object with the given `name`. This should work with names like: FOO (assumes the current package) P:FOO (looks in package P) :FOO (keyword) " ;; TODO: add support for: ;; P::FOO (flet ((split-string (s delim) (let ((idx (position delim s))) (if idx (cons (subseq s 0 idx) (subseq s (1+ idx))) (cons nil s))))) (destructuring-bind (package-name . symbol-name) (split-string (string-upcase name) #\:) (find-symbol symbol-name (cond ((null package-name) *package*) ; no : at all ((string= "" package-name) (find-package "KEYWORD")) ; :keyw (t (find-package package-name))))))) ; pack:sym (define-middleware wrap-documentation "documentation" message (let ((s (find-symbol-harder (fset:lookup message "symbol")))) (respond message (with-when (make-map "status" '("done")) "type-docstring" (documentation s 'type) "structure-docstring" (documentation s 'structure) "variable-docstring" (documentation s 'variable) "setf-docstring" (documentation s 'setf) "function-docstring" (documentation s 'function) "function-arglist" (multiple-value-bind (arglist foundp) (find-lambda-list s) (when foundp (princ-to-string (cons s arglist)))))))) (define-middleware wrap-arglist "arglist" message (let ((s (find-symbol-harder (fset:lookup message "symbol")))) (respond message (with-when (make-map "status" '("done")) "function-arglist" (multiple-value-bind (arglist foundp) (find-lambda-list s) (when foundp (lambda-list-to-string (cons s arglist))))))))