Subject: bug#43586: closed (Re: bug#43586: Flymake can't understand `cl-loop' and `if-let*'.)

From: [email-masked] (GNU bug Tracking System)
Date: Sat, 26 Sep 2020 00:25:01 +0000

Your bug report

#43586: Flymake can't understand `cl-loop' and `if-let*'.

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
43586: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=43586
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#43586: Flymake can't understand `cl-loop' and `if-let*'.
From: [email-masked]
To: [email-masked]
Date: Sat, 26 Sep 2020 00:24:32 +0000
List-Id: <debbugs-submit.debbugs.gnu.org>

Thank you, I had missed adding those.

On 9/24/20 10:44 AM, Lars Ingebrigtsen wrote:
> [email-masked] writes:
>
>> Flymake is giving many errors, for a command that I believe works. This happens
>> with a clean init file.
> [...]
>
>> Here are some of the errors Flymake reports:
>>
>>      19   0 warning  Unused lexical variable ‘formatted-bookmarks’
>>      22   3 warning  ‘(chosen-cand (selectrum-read "Bookmark: "
> [...]
>
>> You can see that it is treating key words as variables in `cl-loop', and cannot
>> see that `actual-data' is defined in `if-let*'. The command works fine when
>> evaluated.
> Do the warnings go away if you put
>
> (require 'cl-lib)
> (require 'subr-x)
>
> in your file?
>
> --
> (domestic pets only, the antidote for overdose, milk.)
>     bloggy blog: http://lars.ingebrigtsen.no

Subject: Flymake can't understand `cl-loop' and `if-let*'.
From: [email-masked]
To: [email-masked]
Date: Thu, 24 Sep 2020 02:10:41 +0000
List-Id: <debbugs-submit.debbugs.gnu.org>

Hello,

Flymake is giving many errors, for a command that I believe works. This happens 
with a clean init file.

The command so far is this:

;;;###autoload
(defun selectrum-bookmark ()
   "Go to or create a bookmark.
To create a bookmark with the same name, use `bookmark-set' (\\[bookmark-set])."
   (interactive)
   ;; Require `bookmark' to load the bookmark list.
   (require 'bookmark)
   ;; Make sure bookmarks are available.
   (unless bookmark-alist
     (if (file-exists-p bookmark-default-file)
         (bookmark-load bookmark-default-file)
       (user-error "selectrum-bookmark: File not found: %s"
                   bookmark-default-file)))
   (let ((formatted-bookmarks
          (and bookmark-alist
               (cl-loop
                for bm in bookmark-alist
                for name = (car bm)
                collect (propertize
                         (replace-regexp-in-string
                          "\n"
                          (propertize "\\n" 'face 'warning )
                          (concat (propertize name 'face 'bold)
                                  ": "
                                  (propertize
                                   (concat (alist-get 'filename bm)
                                           "@"
                                           (number-to-string (alist-get 
'position bm)))
                                   'face 'underline)
                                  ": "
                                  (alist-get 'front-context-string bm)
                                  (propertize "|" 'face 'highlight)
                                  (alist-get 'rear-context-string bm))
                          'fixed-case 'literal)
                         'bm bm)))))
     (if-let* ((chosen-cand (selectrum-read "Bookmark: " formatted-bookmarks))
               (actual-data (get-text-property 0 'bm chosen-cand)))
         (bookmark-jump actual-data)
       (bookmark-set chosen-cand))))

Here are some of the errors Flymake reports:

    19   0 warning  Unused lexical variable ‘formatted-bookmarks’
    22   3 warning  ‘(chosen-cand (selectrum-read "Bookmark: " 
formatted-bookmarks))’ is a malformed function
    34  15 warning  reference to free variable ‘for’
    34  19 warning  reference to free variable ‘bm’
    34  22 warning  reference to free variable ‘in’
    35  19 warning  reference to free variable ‘name’
    35  24 warning  reference to free variable ‘=’
    36  15 warning  reference to free variable ‘collect’
    54  52 warning  reference to free variable ‘chosen-cand’
    55   9 warning  reference to free variable ‘actual-data’

You can see that it is treating key words as variables in `cl-loop', and cannot 
see that `actual-data' is defined in `if-let*'. The command works fine when 
evaluated.

Thank you.