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

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

Re: Faking local dynamic function bindings


From: Stefan Monnier
Subject: Re: Faking local dynamic function bindings
Date: Tue, 28 Jan 2014 22:50:50 -0500
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (gnu/linux)

> (defun foo (sexpr)
>   (eval
>    `(cl-macrolet ((contains (regexp)
>                             `(string-match ,regexp string)))
>       (sort (delq nil (mapcar #'(lambda (item)
>                                   (let ((string (assq item strings-alist)))
>                                     (when ,sexpr)
>                                     string))
>                               items-alist))
>             'string<))))

IIUC, sexpr is only known very late (like much later than when you
byte-compile this file).  If that's the case, there's no avoiding `eval'.
But you can move the eval closer to sexpr:

(defun foo (sexpr)
  (sort (delq nil (mapcar #'(lambda (item)
                              (let ((string (assq item strings-alist)))
                                (when (eval
                                        `(cl-macrolet ((contains (regexp)
                                                        `(string-match ,regexp 
,string)))
                                           ,sexpr))
                                  string))
                          items-alist))
        #'string<)))

And of course, you don't need `contains' to be a macro:
            
(defun foo (sexpr)
  (sort (delq nil (mapcar #'(lambda (item)
                              (let ((string (assq item strings-alist)))
                                (when (eval
                                        `(cl-flet ((contains (regexp)
                                                     (string-match regexp 
,string)))
                                           ,sexpr))
                                  string))
                          items-alist))
        #'string<)))


-- Stefan




reply via email to

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