[Top][All Lists]

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

Re: "Backquote constructs" to "splice" values without "eval".

From: Barry Margolin
Subject: Re: "Backquote constructs" to "splice" values without "eval".
Date: Mon, 07 Jan 2013 10:02:35 -0500
User-agent: MT-NewsWatcher/3.5.3b3 (Intel Mac OS X)

In article <>,
 Oleksandr Gavenko <> wrote:

> I construct TLV (table-len-val) structs in string.
> Is it possible to omit "eval" from second line by using some sugar code:
>   (setq binstr-len 4)
>   (setq binstr (eval `(unibyte-string ?s binstr-len ,@(make-list binstr-len 
>   ?x))))
>   (assert (eq (+ 2 binstr-len) (length binstr)))
> Another solution:
>   (setq binstr (concat (unibyte-string ?s binstr-len) (make-list binstr-len 
>   ?x)))
> Or "apply" stands for this purpose(??):
>   (setq binstr (apply 'unibyte-string ?s binstr-len (make-list binstr-len 
>   ?x)))

The "apply" solution is usually the correct way to do it.

> Seems that "`" use current variable values when sexp *parsed*, while with
> "apply" it use variable values on *evaluation*. Is I am right?

If you do:

(setq sexp `(unibyte-string ?s binstr-len ,@(make-list binstr-len ?x))
(setq binstr-len 6)
(eval sexp)

The first BINSTR-LEN in SEXP will be 6 because it's evaluated by the 
call to EVAL, the second one will be 4 because it's evaluated during the 
SETQ.  In neither case is it evaluated at read time; remember, backquote 
is just a shorthand for code that constructs the list at the time the 
expression is evaluated, so the first line is equivalent to:

(setq sexp (list* 'unibyte-string '?s 'binstr-len (make-list binstr-len 

As you can see, the first UNIBYTE-STRING is quoted, the second one is 
not (because of the comma in the backquote expression), so the latter 
gets evaluated at the time of the SETQ.

Barry Margolin,
Arlington, MA
*** PLEASE post questions in newsgroups, not directly to me ***

reply via email to

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