apropos/apropos-csi.scm

196 lines
5.8 KiB
Scheme

;;;; apropos-csi.scm -*- Scheme -*-
;;;; Kon Lovett, Jul '18
;;;; Kon Lovett, Oct '17
;;;; Kon Lovett, Mar '09
;;;; From the Chicken 4 core, Version 4.0.0x5 - SVN rev. 13662
;; Issues
;;
;; - old csi option
;; ; {{search|mode pre[fix]|suff[ix]|#t}} : {{#:search-mode (or #:prefix #:suffix #t)}}
;; ; {{SEARCH-MODE}} : {{(or #:prefix #:suffix #t)}} for contains. The default is {{#t}}.
(module apropos-csi ()
(import scheme)
(import (chicken base))
(import (chicken fixnum))
(import (chicken platform))
(import (chicken io))
(import (chicken port))
(import apropos-api)
;;(srfi 1)
(import (only (srfi 1) cons*))
#; ;UNUSED until no (srfi 1)
(define (cons* first . rest)
(let recur ((x first) (rest rest))
(if (pair? rest)
(cons x (recur (car rest) (cdr rest)))
x) ) )
;; Constants
;Some options only in full help. ex: "raw", "base [#]", "internal"
;Pad out to CSI-HELP-HEAD-WIDTH 18, No tabs
(define CSI-HELP #<<EOS
,a PATT OPT... Apropos of PATT with OPT from help, mac, ci, imp, sort nam|mod|typ|#f, find nam|mod|#f
EOS
)
(define HELP-TEXT #<<EOS
Pattern:
The pattern PATT is a symbol, string, sre (see irregex), or quoted.
Symbols & strings are interpreted as a substring match.
The quoted PATT (no sort order is implied):
'(PATT . PATT) performs as if `PATT+PATT find module+name` worked.
'(PATT . _) synonym for `PATT find module`.
'(_ . PATT) synonym for `PATT find name`.
'(_ . _) synonym for '.* | '".*" | (: (* any)) ;match any.
'<atom> interpret `<atom>` as an irregex.
Best to present REGEX-style patterns as a string.
Ex: '"^[a-zA-Z]$" vs. '^\[a-zA-Z\]$
Arguments:
help This message
mac | macros Include macro bound symbols
ci | case-insensitive
Pattern has no capitals
imp | imported Only imported identifiers, otherwise global symbols
sort name | module | type | #f
Order items; optional when last argument
find name | module | #f
Pattern match component; optional when last argument
(also see the '(_ . _) pattern)
all Means `ci mac`
krl Means `all sort mod`
base For number valued pattern
raw No listing symbol interpretation (i.e. x123 ~> x)
internal Include internal modules
EOS
)
;;
;; REPL Integeration
;;
(define (interp-find-arg loc arg)
(case arg
((n nam name) #:name)
((m mod module) #:module)
(else
(and arg
(error-apropos-find-key loc "unknown find key" arg)) ) ) )
(define (interp-sort-arg loc arg)
(case arg
((n nam name) #:name)
((m mod module) #:module)
((t typ type) #:type)
(else
(and arg
(error-apropos-sort-key loc "unknown sort key" arg)) ) ) )
(define (display-apropos-help)
(print CSI-HELP)
(print)
(print HELP-TEXT) )
(define (parse-csi-apropos-arguments iargs)
(let* ((patt (and (not (null? iargs)) (car iargs)))
(args (if patt (cdr iargs) '())) )
(let loop ((args args) (oargs `(,patt)))
;
(define (restargs next optarg?)
(cond ((null? next)
'())
(optarg?
(cdr next))
(else
next) ) )
;
(define (arg-next kwd init #!optional optarg?)
(define (thisargs next kwd init optarg?)
(cond ((null? next)
(cons* init kwd oargs))
(optarg?
(cons* (optarg? (car next)) kwd oargs))
(else
(cons* init kwd oargs)) ) )
(let* ((next (cdr args))
(args (restargs next optarg?))
(oargs (thisargs next kwd init optarg?)) )
(loop args oargs) ) )
;
(if (null? args)
;original ordering
(reverse oargs)
;csi-apropos-syntax => keyword-apropos-syntax
(let ((arg (car args)))
(case arg
;
((krl)
(loop (restargs (cons* 'all (cdr args)) #f)
(cons* #:module #:sort oargs)) )
;
((all)
(loop (restargs (cdr args) #f)
(cons* #t #:case-insensitive? #t #:macros? oargs)) )
;
((imp imported)
(arg-next #:imported? #t) )
;
((mac macros)
(arg-next #:macros? #t) )
;
((ci case-insensitive)
(arg-next #:case-insensitive? #t) )
;
((internal)
(arg-next #:internal? #t) )
;
((raw)
(arg-next #:raw? #t) )
;
((base)
(arg-next #:base (apropos-default-base) (cute check-apropos-number-base '|,a| <>)) )
;
((sort)
(arg-next #:sort #:type (cute interp-sort-arg '|,a| <>)) )
;
((find split)
(arg-next #:find #f (cute interp-find-arg '|,a| <>)) )
;
((help)
(loop '() '()) )
;
(else
(loop (cdr args) (cons arg oargs)) ) ) ) ) ) ) )
(define (csi-apropos-command)
(let* ((cmdlin (read-line))
(csi-args (with-input-from-string cmdlin read-list))
(apropos-args (parse-csi-apropos-arguments csi-args)) )
;NOTE will not dump the symbol-table unless explicit
;use '(: (* any)) | '(_ . _)
(if (null? apropos-args)
(display-apropos-help)
(apply apropos apropos-args) ) ) )
;; Main
(when (feature? #:csi)
;; Load csi library at runtime here in Chicken 6 only after we confirm
;; csi is running. Otherwise chicken.csi load fails.
(import (only (chicken csi) toplevel-command))
(toplevel-command 'a csi-apropos-command CSI-HELP) )
) ;module apropos-csi