[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: How do you pre-evaluate a function passed to a macro?
From: |
Barry Margolin |
Subject: |
Re: How do you pre-evaluate a function passed to a macro? |
Date: |
Fri, 13 Nov 2009 12:01:48 -0500 |
User-agent: |
MT-NewsWatcher/3.5.3b3 (Intel Mac OS X) |
In article <mailman.10640.1258121962.2239.help-gnu-emacs@gnu.org>,
gregory@dynapse.com (Gregory J. Grubbs) wrote:
> I'm calling a function, wanting to pass nil instead of the empty string
> when the string argument is zero length. But the function is defined as
> a macro, so the argument gets passed in unevaluated, which fails.
>
> How do I force evaluation of the argument before it is passed in?
Use eval:
(eval `(bbdb-search (bbdb-records)
',(if (> (length myname) 0) myname nil)
nil nil))
>
> --8<---------------cut here---------------start------------->8---
> ;; myname is a string taken from user input
> (bbdb-search (bbdb-records) (if (> (length myname) 0) myname nil) nil nil)
> --8<---------------cut here---------------end--------------->8---
>
> The above call produces the following backtrace:
> --8<---------------cut here---------------start------------->8---
> signal(error ("name must be atomic"))
> error("name must be atomic")
> (or (stringp name) (symbolp name) (error "name must be atomic"))
> (let (clauses) (or (stringp name) (symbolp name) (error "name must be
> atomic")) (or (stringp company) (symbolp company) (error "company must be
> atomic")) (or (stringp net) (symbolp net) (error "net must be atomic")) (or
> (stringp notes) (symbolp notes) (error "notes must be atomic")) (or
> (stringp phone) (symbolp phone) (error "phone must be atomic")) (if phone
> (setq clauses ...)) (if notes (setq clauses ...)) (if name (setq clauses
> ...)) (if net (setq clauses ...)) (if company (setq clauses ...)) (\` (let
> ... ... ...)))
> (lambda (records &optional name company net notes phone) "Search RECORDS
> for optional arguments NAME, COMPANY, NET, NOTES, PHONE.\nThis macro only
> emits code for those things being searched for;\nliteral nils at
> compile-time cause no code to be emitted.\n\nIf you want to reverse the
> search, bind `bbdb-search-invert' to t." (let (clauses) (or ... ... ...)
> (or ... ... ...) (or ... ... ...) (or ... ... ...) (or ... ... ...) (if
> phone ...) (if notes ...) (if name ...) (if net ...) (if company ...) (\`
> ...)))((bbdb-records) (if (> (length myname) 0) myname nil) nil nil)
> (bbdb-search (bbdb-records) (if (> ... 0) myname nil) nil nil)
> eval((bbdb-search (bbdb-records) (if (> ... 0) myname nil) nil nil))
> eval-expression((bbdb-search (bbdb-records) (if (> ... 0) myname nil) nil
> nil) nil)
> call-interactively(eval-expression nil nil)
> --8<---------------cut here---------------end--------------->8---
--
Barry Margolin, barmar@alum.mit.edu
Arlington, MA
*** PLEASE post questions in newsgroups, not directly to me ***
*** PLEASE don't copy me on replies, I'll read them in the group ***