changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/lib/cli/clap/macs.lisp

changeset 698: 96958d3eb5b0
parent: 65102f74d1ae
author: Richard Westhaver <ellis@rwest.io>
date: Fri, 04 Oct 2024 22:04:59 -0400
permissions: -rw-r--r--
description: fixes
419
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
1
 ;;; cli/clap/macs.lisp --- Clap Macros
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
2
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
3
 ;; 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
4
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
5
 ;;; Code:
426
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
6
 (in-package :cli/clap/macs)
419
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
7
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
8
 (defmacro argp (arg &optional (args (args)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
9
   "Test for presence of ARG in ARGS. Return the tail of
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
10
 ARGS starting from the position of ARG."
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
11
   `(member ,arg ,args :test 'equal))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
12
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
13
 (defmacro make-shorty (name)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
14
   "Return the first char of symbol or string NAME."
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
15
   `(character (aref (if (stringp ,name) ,name (symbol-name ,name)) 0)))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
16
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
17
 (defmacro with-cli-handlers (&body body)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
18
   "A wrapper which handles common cli errors that may occur during
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
19
 evaluation of BODY."
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
20
   `(progn
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
21
      (if *no-exit*
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
22
          (sb-ext:enable-debugger)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
23
          (sb-ext:disable-debugger))
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
24
      (unwind-protect
573
f8b76ced5e2d sk print init, reconcile doc:file-header and skel file headers
Richard Westhaver <ellis@rwest.io>
parents: 567
diff changeset
25
           (restart-case
f8b76ced5e2d sk print init, reconcile doc:file-header and skel file headers
Richard Westhaver <ellis@rwest.io>
parents: 567
diff changeset
26
               (progn ,@body)
419
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
27
             (sb-sys:interactive-interrupt ()
479
ff3b057402d1 light cleanup
Richard Westhaver <ellis@rwest.io>
parents: 426
diff changeset
28
               (println ":SIGINT")
573
f8b76ced5e2d sk print init, reconcile doc:file-header and skel file headers
Richard Westhaver <ellis@rwest.io>
parents: 567
diff changeset
29
               (sb-ext:exit :code 130))
f8b76ced5e2d sk print init, reconcile doc:file-header and skel file headers
Richard Westhaver <ellis@rwest.io>
parents: 567
diff changeset
30
             (abort ()
f8b76ced5e2d sk print init, reconcile doc:file-header and skel file headers
Richard Westhaver <ellis@rwest.io>
parents: 567
diff changeset
31
               :report (lambda (s)
f8b76ced5e2d sk print init, reconcile doc:file-header and skel file headers
Richard Westhaver <ellis@rwest.io>
parents: 567
diff changeset
32
                         (write-string
f8b76ced5e2d sk print init, reconcile doc:file-header and skel file headers
Richard Westhaver <ellis@rwest.io>
parents: 567
diff changeset
33
                          "Skip to toplevel READ/EVAL/PRINT loop."
f8b76ced5e2d sk print init, reconcile doc:file-header and skel file headers
Richard Westhaver <ellis@rwest.io>
parents: 567
diff changeset
34
                          s)
f8b76ced5e2d sk print init, reconcile doc:file-header and skel file headers
Richard Westhaver <ellis@rwest.io>
parents: 567
diff changeset
35
                         (log:debug! "CONTINUEing from pre-REPL RESTART-CASE")
f8b76ced5e2d sk print init, reconcile doc:file-header and skel file headers
Richard Westhaver <ellis@rwest.io>
parents: 567
diff changeset
36
                         (values)))
f8b76ced5e2d sk print init, reconcile doc:file-header and skel file headers
Richard Westhaver <ellis@rwest.io>
parents: 567
diff changeset
37
             (exit ()
f8b76ced5e2d sk print init, reconcile doc:file-header and skel file headers
Richard Westhaver <ellis@rwest.io>
parents: 567
diff changeset
38
               :report "Exit SBCL (calling #'EXIT, killing the process)."
f8b76ced5e2d sk print init, reconcile doc:file-header and skel file headers
Richard Westhaver <ellis@rwest.io>
parents: 567
diff changeset
39
               ;; :test (lambda (c) (declare (ignore c)) t)
f8b76ced5e2d sk print init, reconcile doc:file-header and skel file headers
Richard Westhaver <ellis@rwest.io>
parents: 567
diff changeset
40
               (log:debug! "falling through to EXIT from pre-REPL RESTART-CASE")
f8b76ced5e2d sk print init, reconcile doc:file-header and skel file headers
Richard Westhaver <ellis@rwest.io>
parents: 567
diff changeset
41
               (exit :code 1))))
f8b76ced5e2d sk print init, reconcile doc:file-header and skel file headers
Richard Westhaver <ellis@rwest.io>
parents: 567
diff changeset
42
      (sb-impl::flush-standard-output-streams)
419
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
43
        ;; reset terminal state
573
f8b76ced5e2d sk print init, reconcile doc:file-header and skel file headers
Richard Westhaver <ellis@rwest.io>
parents: 567
diff changeset
44
        #+nil (.ris)))
419
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
45
 
479
ff3b057402d1 light cleanup
Richard Westhaver <ellis@rwest.io>
parents: 426
diff changeset
46
 ;; TODO fix these macros
419
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
47
 (defmacro defcmd (name &body body)
655
65102f74d1ae some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents: 643
diff changeset
48
   `(defun ,name (args opts)
563
8b10eabe89dd std/tests, clap tweaks
Richard Westhaver <ellis@rwest.io>
parents: 562
diff changeset
49
      (declare (ignorable args opts)
565
bf483eff77dc fix type decl2
Richard Westhaver <ellis@rwest.io>
parents: 564
diff changeset
50
               (sequence args opts))
655
65102f74d1ae some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents: 643
diff changeset
51
      (let ((*argc* (length args))
65102f74d1ae some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents: 643
diff changeset
52
            (*optc* (length opts))
65102f74d1ae some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents: 643
diff changeset
53
            (*args* args)
65102f74d1ae some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents: 643
diff changeset
54
            (*opts* opts))
65102f74d1ae some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents: 643
diff changeset
55
        ,@body)))
419
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
56
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
57
 (defmacro defopt (name &body body)
561
42bc1432f217 bin updates
Richard Westhaver <ellis@rwest.io>
parents: 560
diff changeset
58
   `(defun ,name (&optional arg)
655
65102f74d1ae some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents: 643
diff changeset
59
      (let ((*arg* arg))
65102f74d1ae some optimizations, may have muddied the waters with cli-opt a bit though.. tbd
Richard Westhaver <ellis@rwest.io>
parents: 643
diff changeset
60
        ,@body)))
419
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
61
 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
62
 ;; TODO 2023-10-06: 
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
63
 ;; (defmacro gen-cli-thunk (pvars &rest thunk)
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
64
 ;;   "Generate and return a function based on THUNK suitable for the :thunk
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
65
 ;; slot of cli objects with pandoric bindings PVARS.")
426
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
66
 (eval-always
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
67
   (defmacro make-opt-parser (kind-spec &body body)
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
68
     "Return a KIND-opt-parser function based on KIND-SPEC which is either a
419
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
69
 symbol from *cli-opt-kinds* or a list, and optional BODY which
0f0e5f9b5c55 add emacs/babel.org, finished clap refactor phase 1, test system fixes and more top-level packages
Richard Westhaver <ellis@rwest.io>
parents: 404
diff changeset
70
 is a list of handlers for the opt-val."
426
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
71
     (let* ((kind (if (consp kind-spec) (car kind-spec) kind-spec))
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
72
            (super (when (consp kind-spec) (cadr kind-spec)))
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
73
            (fn-name (symbolicate 'parse- kind '-opt)))
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
74
       ;; thread em
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
75
     (let ((fn1 (unless (null super) (symbolicate "PARSE-" super "-OPT"))))
560
b9c64be96888 make cli/clap more dynamic
Richard Westhaver <ellis@rwest.io>
parents: 479
diff changeset
76
       `(defun ,fn-name (&optional arg)
b9c64be96888 make cli/clap more dynamic
Richard Westhaver <ellis@rwest.io>
parents: 479
diff changeset
77
          "Parse the cli-opt-val *ARG*."
b9c64be96888 make cli/clap more dynamic
Richard Westhaver <ellis@rwest.io>
parents: 479
diff changeset
78
          (declare (ignorable arg))
643
f901de70a80e opt fixes and test updates
Richard Westhaver <ellis@rwest.io>
parents: 573
diff changeset
79
          ,@(if fn1
f901de70a80e opt fixes and test updates
Richard Westhaver <ellis@rwest.io>
parents: 573
diff changeset
80
                `((setf *arg* (print (funcall #',fn1 arg))))
f901de70a80e opt fixes and test updates
Richard Westhaver <ellis@rwest.io>
parents: 573
diff changeset
81
                `((setf *arg* arg)))
426
3e721a3349a0 completed phase2 of clap migration
Richard Westhaver <ellis@rwest.io>
parents: 419
diff changeset
82
          ,@body)))))