[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Lexical let and setq
From: |
Michael Welsh Duggan |
Subject: |
Lexical let and setq |
Date: |
Fri, 13 Sep 2013 20:09:05 -0400 |
User-agent: |
Gnus/5.130008 (Ma Gnus v0.8) Emacs/24.3.50 (gnu/linux) |
Stefan Monnier <address@hidden> writes:
[...]
> I do hope to fix those issues by introducing other byte-codes which will
> let us generate significantly more efficient code for those constructs,
> but in 24.1, the priority was to get lexical-binding to work correctly,
> performance being a secondary concern (tho for most idiomatic Elisp
> code, the performance tends to be competitive).
>
> What people should know is that
>
> (let (x y z)
> ...(setq x ...)
> ...(setq z ...)
> ...(setq y ...)
>
> is often a bad idea in Elisp, and even more so in lexical-binding code
> (in some cases, if a variable is immutable it can be handled
> significantly more efficiently, so the mere existence of a single `setq'
> on a variable can sometimes slow other chunks of code: in many cases
> `let' is cheaper than `setq').
The primary reason I have seen the (let (foo) (setq foo ...)) idiom is
in looping code. The way I would normally try to avoid this idiom in
most FP languages would be to use recursion (specifically tail
recursion, if possible). I know some work was done on implementing
efficient tail-recursion in the byte compiler. Has any of that made it
onto the trunk yet?
--
Michael Welsh Duggan
(address@hidden)
- Lexical let and setq,
Michael Welsh Duggan <=