home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / lang / lisp / gcl-1.000 / gcl-1 / gcl-1.0 / lsp / packlib.lsp < prev    next >
Encoding:
Lisp/Scheme  |  1994-05-07  |  5.2 KB  |  168 lines

  1. ;; Copyright (C) 1994 M. Hagiya, W. Schelter, T. Yuasa
  2.  
  3. ;; This file is part of GNU Common Lisp, herein referred to as GCL
  4. ;;
  5. ;; GCL is free software; you can redistribute it and/or modify it under
  6. ;;  the terms of the GNU LIBRARY GENERAL PUBLIC LICENSE as published by
  7. ;; the Free Software Foundation; either version 2, or (at your option)
  8. ;; any later version.
  9. ;; 
  10. ;; GCL is distributed in the hope that it will be useful, but WITHOUT
  11. ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12. ;; FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public 
  13. ;; License for more details.
  14. ;; 
  15. ;; You should have received a copy of the GNU Library General Public License 
  16. ;; along with GCL; see the file COPYING.  If not, write to the Free Software
  17. ;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  
  19.  
  20. ;;;;    packlib.lsp
  21. ;;;;
  22. ;;;;                    package routines
  23.  
  24.  
  25. (in-package 'lisp)
  26.  
  27.  
  28. (export '(find-all-symbols do-symbols do-external-symbols do-all-symbols))
  29. (export '(apropos apropos-list))
  30.  
  31.  
  32. (in-package 'system)
  33.  
  34.  
  35. (proclaim '(optimize (safety 2) (space 3)))
  36.  
  37.  
  38. (defmacro coerce-to-package (p)
  39.   (if (eq p '*package*)
  40.       p
  41.       (let ((g (gensym)))
  42.         `(let ((,g ,p))
  43.            (if (packagep ,g)
  44.                ,g
  45.                (find-package (string ,g)))))))
  46.  
  47. (defun find-all-symbols (string-or-symbol)
  48.   (when (symbolp string-or-symbol)
  49.         (setq string-or-symbol (symbol-name string-or-symbol)))
  50.   (mapcan #'(lambda (p)
  51.               (multiple-value-bind (s i)
  52.                   (find-symbol string-or-symbol p)
  53.                 (if (or (eq i :internal) (eq i :external))
  54.                     (list s)
  55.                     nil)))
  56.           (list-all-packages)))
  57.  
  58.  
  59. (defmacro do-symbols ((var &optional (package '*package*) (result-form nil))
  60.                       . body)
  61.   (let ((p (gensym)) (i (gensym)) (l (gensym))
  62.         (loop (gensym)) (x (gensym))(y (gensym)) (break (gensym)) declaration)
  63.     (multiple-value-setq (declaration body) (find-declarations body))
  64.     `(let ((,p (coerce-to-package ,package)) ,var ,l)
  65.        ,@declaration
  66.        (multiple-value-bind (,y ,x)
  67.         (package-size ,p)
  68.             (declare (fixnum ,x ,y))
  69.        (dotimes (,i (+ ,x ,y) (progn (setq ,var nil) ,result-form))
  70.          (setq ,l (if (< ,i ,x)
  71.                       (si:package-internal ,p ,i)
  72.                       (si:package-external ,p (- ,i ,x))))
  73.        ,loop
  74.          (when (null ,l) (go ,break))
  75.          (setq ,var (car ,l))
  76.          ,@body
  77.          (setq ,l (cdr ,l))
  78.          (go ,loop)
  79.        ,break)))))
  80.        
  81.  
  82. (defmacro do-external-symbols
  83.           ((var &optional (package '*package*) (result-form nil)) . body)
  84.   (let ((p (gensym)) (i (gensym)) (l (gensym))
  85.         (loop (gensym)) (break (gensym)) declaration)
  86.     (multiple-value-setq (declaration body)
  87.                          (find-declarations body))
  88.     `(let ((,p (coerce-to-package ,package)) ,var ,l)
  89.        
  90.        ,@declaration
  91.        (dotimes (,i (package-size ,p) (progn (setq ,var nil) ,result-form))
  92.          (setq ,l (si:package-external ,p ,i))
  93.        ,loop
  94.          (when (null ,l) (go ,break))
  95.          (setq ,var (car ,l))
  96.          ,@body
  97.          (setq ,l (cdr ,l))
  98.          (go ,loop)
  99.        ,break))))
  100.  
  101. (defmacro do-all-symbols((var &optional (result-form nil)) . body)
  102.   `(dolist (.v (list-all-packages) ,result-form)
  103.        (do-symbols (,var .v)
  104.                ,@ body)))
  105.        
  106.  
  107. (defun substringp (sub str)
  108.   (do ((i (- (length str) (length sub)))
  109.        (l (length sub))
  110.        (j 0 (1+ j)))
  111.       ((> j i) nil)
  112.     (when (string-equal sub str :start2 j :end2 (+ j l))
  113.           (return t))))
  114.  
  115.  
  116. (defun print-symbol-apropos (symbol)
  117.   (prin1 symbol)
  118.   (when (fboundp symbol)
  119.         (if (special-form-p symbol)
  120.             (princ "  Special form")
  121.             (if (macro-function symbol)
  122.                 (princ "  Macro")
  123.                 (princ "  Function"))))
  124.   (when (boundp symbol)
  125.         (if (constantp symbol)
  126.             (princ "  Constant: ")
  127.             (princ "  has value: "))
  128.         (prin1 (symbol-value symbol)))
  129.   (terpri))
  130.  
  131.  
  132. (defun apropos (string &optional package)
  133.   (setq string (string string))
  134.   (cond (package
  135.          (do-symbols (symbol package)
  136.            (when (substringp string (string symbol))
  137.                  (print-symbol-apropos symbol)))
  138.          (do ((p (package-use-list package) (cdr p)))
  139.              ((null p))
  140.            (do-external-symbols (symbol (car p))
  141.              (when (substringp string (string symbol))
  142.                    (print-symbol-apropos symbol)))))
  143.         (t
  144.          (do-all-symbols (symbol)
  145.            (when (substringp string (string symbol))
  146.                  (print-symbol-apropos symbol)))))
  147.   (values))
  148.  
  149.  
  150. (defun apropos-list (string &optional package &aux list)
  151.   (setq list nil)
  152.   (setq string (string string))
  153.   (cond (package
  154.          (do-symbols (symbol package)
  155.            (when (substringp string (string symbol))
  156.                  (setq list (cons symbol list))))
  157.          (do ((p (package-use-list package) (cdr p)))
  158.              ((null p))
  159.            (do-symbols (symbol (car p))
  160.              (when (substringp string (string symbol))
  161.                    (setq list (cons symbol list))))))
  162.         (t
  163.          (do-all-symbols (symbol)
  164.            (when (substringp string (string symbol))
  165.                  (setq list (cons symbol list))))))
  166.   list)
  167.  
  168.