1

Have set the last three function arguments to optional. When calling the elisp function in code (rather than interactively), how can I check the optional arguments fol nil?

When brcmk-end in nil, I do not want the search-forward to occur on $endmk.

When rgn-beg and rgn-end are nil, I could default to (region-beginning) and (region-end).

    (defun rk-bracemk-count-2 (brcmk-beg &optional brcmk-end rgn-beg rgn-end)
      "Count brace marks within a selected region.
    
    BRCMK-BEG  Opening brace mark.
    BRCMK-END  Closing brace mark.
    RGN-BEG    Region start marker or position.
    RGN-END    Region end marker or position."
    
      (interactive
       (list (read-char-from-minibuffer "Opening bracemark: ")
             (read-char-from-minibuffer "Closing bracemark: ")
             (region-beginning)
             (region-end) ))
      
      (save-excursion
        (let ( ($a  0) ($b  0) 
               ($begmk  (char-to-string brcmk-beg))
               ($endmk  (char-to-string brcmk-end)) )
    
          (goto-char rgn-beg)
          (while (and (< (point) rgn-end)
                      (search-forward $begmk rgn-end t))
            (cl-incf $a))
    
          (goto-char rgn-beg)
          (while (and (< (point) rgn-end)
                      (search-forward $endmk rgn-end t))
            (cl-incf $b))
    
          (message "Marks: %s %s  Counts: %d %d" $begmk $endmk $a $b)
          (goto-char rgn-beg) )))
Dilna
  • 1,173
  • 3
  • 10

1 Answers1

1

Use cl-defun:

(cl-defun rk-bracemk-count-2 (brcmk-beg &optional brcmk-end (rgn-beg (region-beginning) (rgn-end (region-end)))
...
  (let ( ($a  0) ($b  0) 
   ($begmk  (char-to-string brcmk-beg))
   ($endmk  (or (and brcmk-end (char-to-string brcmk-end)) ""))

...
  (while (and brcmk-end
              (< (point) rgn-end)
                  (search-forward $endmk rgn-end t))
        (cl-incf $b))
...
Phil Hudson
  • 1,651
  • 10
  • 13