all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* bug#748: Elisp: lexical-let and cyclic structures
@ 2008-08-20 13:57 Michael Heerdegen
  2008-08-21  1:12 ` Stefan Monnier
  0 siblings, 1 reply; 3+ messages in thread
From: Michael Heerdegen @ 2008-08-20 13:57 UTC (permalink / raw
  To: emacs-pretest-bug

When using the reader constructs `#N=' and `#N#' for cyclic
structures, lexical-let sometimes produces errors which don't occur
with let.

Example: Eval the following:

(defun f (start)
  (lexical-let (start start)         ;; return a closure
    #1=(lambda (x) (if (= x start) x
		     (+ x (#1# (1- x)))))))

Then evaluating f ends with an error:

   (f 3)

    "Variable binding depth exceeds max-specpdl-size"


The problem also occurs without lambdas. Examples:

   (let         () '#1=(#1#))               ;; ==> (#0)
   (lexical-let () '#1=(#1#))               ;;  Error
   (let ((x '#1=(#1#))) (lexical-let () x)) ;; ==> (#0)
   `#1=(#1#)                                ;;  Error






^ permalink raw reply	[flat|nested] 3+ messages in thread

* bug#748: Elisp: lexical-let and cyclic structures
  2008-08-20 13:57 bug#748: Elisp: lexical-let and cyclic structures Michael Heerdegen
@ 2008-08-21  1:12 ` Stefan Monnier
  2011-07-09 17:51   ` Glenn Morris
  0 siblings, 1 reply; 3+ messages in thread
From: Stefan Monnier @ 2008-08-21  1:12 UTC (permalink / raw
  To: 748

tag +748 wontfix
thanks

> When using the reader constructs `#N=' and `#N#' for cyclic
> structures, lexical-let sometimes produces errors which don't occur
> with let.

Most programming languages do not accept infinite programs.  Elisp is
no exception.  The fact that you can build cyclic abstract syntax trees
and that they sometimes get evaluated correctly is just an accident.

I.e. if it hurts, don't do it.

> (defun f (start)
>   (lexical-let (start start)         ;; return a closure
>     #1=(lambda (x) (if (= x start) x
> 		     (+ x (#1# (1- x)))))))

For this case, I'd recommend to make the recursion explicit, e.g.:

   (defun f (start)
     (lexical-let ((start start))         ;; return a closure
       (labels ((loop (x) (if (= x start) x
   		           (+ x (loop (1- x))))))
         loop)))


-- Stefan






^ permalink raw reply	[flat|nested] 3+ messages in thread

* bug#748: Elisp: lexical-let and cyclic structures
  2008-08-21  1:12 ` Stefan Monnier
@ 2011-07-09 17:51   ` Glenn Morris
  0 siblings, 0 replies; 3+ messages in thread
From: Glenn Morris @ 2011-07-09 17:51 UTC (permalink / raw
  To: 748-done


I don't see a need to keep open this particular report, which was marked
"wontfix" some time ago.

Stefan Monnier wrote:

> Most programming languages do not accept infinite programs.  Elisp is
> no exception.  The fact that you can build cyclic abstract syntax trees
> and that they sometimes get evaluated correctly is just an accident.
>
> I.e. if it hurts, don't do it.





^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2011-07-09 17:51 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-08-20 13:57 bug#748: Elisp: lexical-let and cyclic structures Michael Heerdegen
2008-08-21  1:12 ` Stefan Monnier
2011-07-09 17:51   ` Glenn Morris

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.