help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: elisp newbie: simplifying from cl structures?


From: Pascal J. Bourguignon
Subject: Re: elisp newbie: simplifying from cl structures?
Date: Sun, 08 Feb 2015 04:37:38 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux)

torys.anderson@gmail.com (Tory S. Anderson) writes:

> Thanks for helping me straighten the code out and gain better
> understanding cl-tools and structure; it loads and mostly
> works. Thanks!
>
> (defun change-smtp ()
>   "Change the SMTP server according to the current from line."
>   (save-excursion
>     (cl-loop with from = (save-restriction
>                          (message-narrow-to-headers)
>                          (message-fetch-field "from"))
>            for (address server port) in smtp-accounts
>            do (if  (string-match address from)
>                   (return (funcall 'set-smtp server port address))
>                 (message "Failed to match %s with %s" address from))
>            finally (error "Cannot infer SMTP information."))))
>
> (add-hook 'message-send-mail-hook 'change-smtp)

Ok, but now, you should consider that this functions is performing
several tasks of different order: some parsing of a message is done, as
well as some searching for smtp configuration, and some setting of smtp
configuration.  That's a lot for a single function.

It would be better if you split it as follow, which would give you two
nice reusable functions, and makes change-smtp clearer:

      
(defun message-from-field ()
  "Find the from field in the current buffer that must contain a message."
  (save-excursion
   (save-restriction
    (message-narrow-to-headers)
    (message-fetch-field "from"))))


(defun find-smtp-account (address accounts)
  "Find the first account in `accounts' whose address matches `address'."
  (find from accounts :key (function first)
                           :test (lambda (from address)
                                   (string-match address from))))

(defun change-smtp ()
  (let ((from (message-from-field)))
    (destructuring-bind (address server port) (find-smtp-account from 
smtp-accounts)
      (if address
          (funcall 'set-smtp server port address)
          (error "Cannot not infer SMTP information")))))


-- 
__Pascal Bourguignon__                 http://www.informatimago.com/
“The factory of the future will have only two employees, a man and a
dog. The man will be there to feed the dog. The dog will be there to
keep the man from touching the equipment.” -- Carl Bass CEO Autodesk


reply via email to

[Prev in Thread] Current Thread [Next in Thread]