[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