;;;; 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 #< interpret `` 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