|
Wordle 990 3/6
β¬π©β¬π¨β¬
π¨π¨β¬β¬β¬
π©π©π©π©π©
|
|
|
|
|
π¨β¬β¬π¨β¬
β¬π©π©β¬π¨
β¬π©π©π©π©
π©π©π©π©π©
In a closed society where everybody's guilty, the only crime is getting caught. In a world of thieves, the only final sin is stupidity. - Hunter S Thompson - RIP
|
|
|
|
|
Wordle 990 6/6
β¬β¬β¬π¨β¬
π¨β¬β¬β¬β¬
β¬π¨β¬β¬β¬
β¬π©β¬β¬β¬
β¬π©π©π©π©
π©π©π©π©π©
Ok, I have had my coffee, so you can all come out now!
|
|
|
|
|
Whether by bag, or backpack, or shoulder or car
In any weather, and wherever you are
This little orange kitten loves to travel with you
To adventure and play, and her name is Minou
Orange shoulder kitten![^]
Check out my IoT graphics library here:
https://honeythecodewitch.com/gfx
And my IoT UI/User Experience library here:
https://honeythecodewitch.com/uix
|
|
|
|
|
I was expecting a cat βtamagotchiβ based on earlier posts.
|
|
|
|
|
|
your cat? I have a dream of one day picking out my own pet. All I get are hand me downs from the children - who have been told it will never happen again.
Charlie Gilley
βThey who can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.β BF, 1759
Has never been more appropriate.
|
|
|
|
|
I love closures and lambdas, but I was quite amused when I wrote the following buggy code:
for (int i=0; i <= 10; i++)
{
var task = Task.Run(async () =>
{
var convertResp = await StartTestConvert(i);
... other stuff
});
} And was wondering, how in the world does i get equal to 11!!!
Answer: bad closure. Fix:
for (int i=0; i <= 10; i++)
{
int n = i;
var task = Task.Run(async () =>
{
var convertResp = await StartTestConvert(n);
... other stuff
});
}
I think this would make a good interview question!
modified 4-Mar-24 10:13am.
|
|
|
|
|
Marc Clifton wrote: I think this would make a good interview question!
And I thought this was fairly common knowledge!
(Not that that would preclude it from being an interview question, of course.)
They "fixed" the behaviour for the foreach loop back in C# 5, but deliberately chose not to change the for loop:
UPDATE: We are taking the breaking change. In C# 5, the loop variable of a foreach will be logically inside the loop, and therefore closures will close over a fresh copy of the variable each time. The for loop will not be changed.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
That's the follow-up interview question. "On what for loops does closure work?"
|
|
|
|
|
From my experience there are most probably programmers who would fix it like this
for (int i = 0; i <= 10; System.Threading.Thread.Sleep(10), i++)
{
....
}
|
|
|
|
|
Reminded me of The Deadlock Empire[^].
A game where you're a scheduler and have to break code by switching contexts
You can play it for free in your browser, no registration or anything.
|
|
|
|
|
I do not see the difference whether using i or n.
Is async call creating a thread?
Is this a C# thing?
lambda?
Closure? seems like a definition of global and local variable spaces.
Confused
"A little time, a little trouble, your better day"
Badfinger
|
|
|
|
|
It has to do with capture, where we grab the value of i by the use of assignment into n before launching another task.
There is nothing magical about using a variable named n ... we could have called it george . What's important is that the current value of i in the for loop is captured before launching the task.
If we had not done that, the for loop would complete execution, setting i to 11 before the first task was launched. That is what is meant by closure.
|
|
|
|
|
Marc Clifton wrote: I think this would make a good interview question! To mention the language that shall not be named (it rhymes with GuavaScript), closures was one of the ways to fake OOP before es6 came along with classes.
function FakeClass() {
const protectMe = 'When I grow up, I wanna be a class!';
this.doSomething = function() {
console.log(protectMe);
}
}
const sup = new FakeClass();
console.log(sup.protectMe);
sup.doSomething();
These days I tend to use closures less and less with generators, promises, async/await, etc. There are just new ways to do the same thing in the language that shall not name be named. But, if you ever find yourself needing to access that lexical context after the parent function go bye bye (a static variable wouldn't quite cut it for that) and you don't want to clutter up your code with global/module crap... closures are a life saver.
All-in-all, cool stuff.
Jeremy Falcon
|
|
|
|
|
lambdas/closures are used in "Lisp, C#, C++, Lua, Python, Ruby, JavaScript, Java, Excel or Google sheets" according to stack overflow, hence my unfamiliarity, being a lowly C guy. Thanx to CP, I have a new appreciation.
"A little time, a little trouble, your better day"
Badfinger
|
|
|
|
|
Cβs still an awesome language. Always will be. Canβt hurt to learn a second one though to be introduced to modern concepts. Some you can bring back to C, even if you have to implement them yourself. Either way, C rulez yo.
Jeremy Falcon
modified 5-Mar-24 9:15am.
|
|
|
|
|
thanx jeremy this helps
"A little time, a little trouble, your better day"
Badfinger
|
|
|
|
|
Youβre welcome man. You can actually do even more with closures too. Might type up some other examples tomorrow.
Jeremy Falcon
|
|
|
|
|
|
That is why Java will only let you use final βvariablesβ for anonymous inner classes.
Does StartTestConvert() receive by value/copy or by reference? ( Does it matter?)
I would tend to wrap some of this into a class. I have moved in the direction of hiding threads/locks/async/await etc as much as possible from the client code.
new Runner(i).launch();
|
|
|
|
|
int n = i;
Amazing solution from an amazing language to cut the code clutter delivered to you by the Cool Kids on the Codeblock!
|
|
|
|
|
From the good, old K&R C bible:
A for that does not include a continue:
for (e1; e2; e3)
Block;
is equivalent to:
e1;
while(e2)
{
Block;
e3;
}
Replace e1 with (int i = 0;) and it will become clear what is the scope of i, and why it will have value 11.
All subsequent languages like C++, java, C# etc. follows the same logic, since nobody dares to change what DMR (may God rest his soul in peace) has ruled.
|
|
|
|
|
ChatGPT explained this to me. I feel bad that I couldn't figure this one out
Question to ChatGPT:
In this example c# code "i" can equal 11. can you fix it?
for (int i=0; i <= 10; i++)
{
var task = Task.Run(async () =>
{
var convertResp = await StartTestConvert(i);
... other stuff
});
}
Response:
Yes, in the provided code, the variable i is captured by the async lambda expression, which means by the time the async operations inside the lambda complete, the value of i may have changed. To fix this, you need to capture the loop variable correctly. Here's a way to do it:
for (int i = 0; i <= 10; i++)
{
int current = i;
var task = Task.Run(async () =>
{
var convertResp = await StartTestConvert(current);
});
}
By capturing the loop variable inside the loop, you ensure that each async operation receives its own copy of the loop variable, preventing the issue where the value of i changes before the async operation completes.
|
|
|
|
|
I just had a conversation with ChatGPT about the topic. It was interesting that I was asking it questions about some specifics about what it was explaining and it did not fall over into a "I'm sorry, 2 plus 2 does equal 5" type of conversation. That has happened a lot to me in the past when trying to understand something.
|
|
|
|