[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: make-thread with lambda form instead of function symbol
From: |
Eric Abrahamsen |
Subject: |
Re: make-thread with lambda form instead of function symbol |
Date: |
Sun, 16 Apr 2017 13:02:54 -0700 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/26.0.50 (gnu/linux) |
Noam Postavsky <address@hidden> writes:
> On Sun, Apr 16, 2017 at 2:11 PM, Eric Abrahamsen
> <address@hidden> wrote:
>>
>> (setq lexical-binding t)
>>
>> (let ((threads
>> (mapcar
>> (lambda (el)
>> (make-thread
>> (lambda ()
>> (push (cl-incf el) results))))
>> '(1 2 3)))
>> results)
>> (mapc #'thread-join threads)
>> results)
>>
>> This gives me nil.
>>
>> (Incidentally, if I put this in a function and edebug it, it tells me
>> edebug will stop at the next break point, and then enters a level of
>> recursive editing I can't escape from: C-M-c gives me "No catch for tag:
>> exit, nil".)
>>
>> Should the above example work?
>
> No, check the compile warnings:
>
> a.el:7:33:Warning: reference to free variable ‘results’
> a.el:9:7:Warning: assignment to free variable ‘results’
Aha! That makes sense now that I see it. The thread function starts
executing immediately, so of course it needs to be able to see
"results". Thanks for that.
> Not sure about the edebug thing, probably it doesn't handle
> cross-thread stepping.
I can imagine it would be complicated.
Thanks again,
Eric
Re: make-thread with lambda form instead of function symbol, Eli Zaretskii, 2017/04/17
Re: make-thread with lambda form instead of function symbol, Andrew Cohen, 2017/04/17