Thanks! I will have a look at the sprint tomorrow.
> On 30 Aug 2018, at 07:11, Tim Mackinnon <[email protected]> wrote: > > I’ve submitted a PR for what I did, so at least it improves the situation > (but potentially could get even more refined as you suggest) > > Tim > >> On 23 Aug 2018, at 11:26, Marcus Denker <[email protected]> wrote: >> >> >> >>> On 23 Aug 2018, at 15:56, Tim Mackinnon <[email protected]> wrote: >>> >>> Hi Marcus - that’s actually what I do - and “create” in this case, creates >>> a class and then restarts like the method case does. >>> >> >> Yes, that I saw. >> >> But I mean a different case: Imagine you do have code like >> >> nil doSomething >> >> or an expression that evaluates to nil, press “define” and get a method >> definition dialog, not the error message? >> (it is, as I mentioned, not that important as nobody ever wants to define a >> method in UndefinedObject, but for consistency it would be nice) >> >> >>> I guess I was wondering if we can do it more cleanly and also improve the >>> debugger message. >>> >>> If I’ve understood you guys correctly- you try to remove the ambiguity >>> around operations. Looking up a class and getting nil - seems like one of >>> these holes you keep sorting out. >>> >>> I think the flaw in my solution is understanding if that message was being >>> sent to a class, or some other global? I dont think I got that bit right >>> (but it’s certainly better than nothing). >>> >>> e.g. in the debugger I am doing (in DoesNotUnderstandDebugAction) >>> >>> msg := self interruptedContext tempAt: 1. >>> (msg lookupClass == UndefinedObject ) ifTrue: [ >>> ^self createMissingClassIn: self interruptedContext ]. >>> >>> >>> I’m not totally convinced that lookupClass has to be a class - although >>> maybe its good enough. But really, at the time this happened - we probably >>> knew better than to get a DNU debug action in the the first place - and >>> equally the title in the debugger could be something more akin to the kind >>> of action its supposed to be. >>> >>> Anyway - this is all musing on my part - and I will assemble a proper PR >>> for review by you guys (and at least it advances us forward - and maybe >>> opens the door to better changes further on). >>> >>> I’m just juggling another change at the moment - so it will be a few days. >>> >>> Tim >>> >>> Sent from my iPhone >>> >>>> On 23 Aug 2018, at 05:33, Marcus Denker <[email protected]> wrote: >>>> >>>> >>>> >>>>> On 22 Aug 2018, at 16:24, Tim Mackinnon <[email protected]> wrote: >>>>> >>>>> Hi - but I guess my question is (and excuse my basic knowledge in this >>>>> area) - when a class isn’t found - can we do better than return nil so >>>>> that the debugger can give a better msg and presumably the code I’ve >>>>> written could live on that undefined object? Or am thinking about this >>>>> wrong? >>>> >>>> In pharo7 we could easily do that (due to the “binding”, the meta class of >>>> the variable) being different. We could return a nil subclass or add code >>>> into the method directly. But the problem with that is that nil checks >>>> are always identity checks… >>>> >>>> Could you not in the case you now raise the error just fall back to the >>>> “define method”, the behaviour we have now? >>>> >>>> Marcus >>>> >>>>> >>>>> I will also put together a pr for this in Pharo 7 if you think it’s a >>>>> decent fix. >>>>> >>>>> Tim >>>>> >>>>> Sent from my iPhone >>>>> >>>>> >>>>> >>>>> Sent from my iPhone >>>>>> On 22 Aug 2018, at 09:51, Marcus Denker <[email protected]> wrote: >>>>>> >>>>>> Hi, >>>>>> >>>>>> I played with it, nice! >>>>>> >>>>>> I guess the case when you really get a DNU on nil (and want to create >>>>>> method there) does not really happen… extending nil is for special cases. >>>>>> >>>>>> Marcus >>>>>> >>>>>> >>>>>>> On 22 Aug 2018, at 13:39, Tim Mackinnon <[email protected]> wrote: >>>>>>> >>>>>>> Sorry Marcus - you needed to follow the exercism instructions and right >>>>>>> click on the exercism package to get an exercism menu to fetch a new >>>>>>> exercise (e.g. hello-world). The is then using the TonalReader to pull >>>>>>> in code - and then you get a test class that can reference a class that >>>>>>> isn’t there yet. (But you need to have the exercism cli installed as >>>>>>> per the instructions etc). >>>>>>> >>>>>>> In retrospect I think it might be simpler to download this 6.1 image >>>>>>> that already has done that - >>>>>>> https://www.dropbox.com/s/x2ot9f8arbbvlyb/PharoExercism.zip?dl=0 >>>>>>> It has TwoFerTest that is in that state. If you click on the >>>>>>> TestWithName orb, you will see "#new was sent to nil” - can you can see >>>>>>> how my Create button has been fixed per you suggestions to create a >>>>>>> class. (The code I wrote is in >>>>>>> ExercismTools:DoesNotUnderstandDebugAction>>createMissingClassIn:) >>>>>>> >>>>>>> Tim >>>>>>> >>>>>>> >>>>>>>> On 22 Aug 2018, at 04:44, Marcus Denker <[email protected]> wrote: >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>>> On 17 Aug 2018, at 14:20, Tim Mackinnon <[email protected]> wrote: >>>>>>>>> >>>>>>>>> The direct link to instructions is here: >>>>>>>>> https://exercism.io/tracks/pharo/installation (not sure if you have >>>>>>>>> to be signed up to see it otherwise its in the repo here: >>>>>>>>> https://github.com/exercism/pharo/blob/master/docs/INSTALLATION.md) >>>>>>>> >>>>>>>> Hm… AllExercismTests seems to not be there (just a green test in >>>>>>>> Welcome) >>>>>>>> >>>>>>>> Is this supposed to contain the code below (the >>>>>>>> createMissingClassActionFor:in:) ? >>>>>>>> >>>>>>>> It would be nice to have an image that shows exactly the problem (I do >>>>>>>> not have that much time sadly to work on it,but I do have some time >>>>>>>> to check if I have an image that is set up to the point where i can >>>>>>>> easily recreate the problem) >>>>>>>> >>>>>>>> Marcus >>>>>>>> >>>>>>>> >>>>>>>>> Tim >>>>>>>>> >>>>>>>>>> On 17 Aug 2018, at 07:17, Marcus Denker <[email protected]> >>>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>> On 17 Aug 2018, at 13:00, Tim Mackinnon <[email protected]> wrote: >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> Hi Marcus - I can put an image somewhere if that helps (do you just >>>>>>>>>>> need the .image and .changes)? >>>>>>>>>>> >>>>>>>>>>> Or you can repro from a fresh 6.1 if you follow the exercism Pharo >>>>>>>>>>> instructions (https://exercism.io/tracks/pharo) to load the first >>>>>>>>>>> hello world-world example and run the tests. This has my code >>>>>>>>>>> changes to make create work with a nil class - but maybe we can do >>>>>>>>>>> better? >>>>>>>>>> I will do that and have a look! >>>>>>>>>> >>>>>>>>>>> Tim >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> Sent from my iPhone >>>>>>>>>>> >>>>>>>>>>>> On 17 Aug 2018, at 06:21, Marcus Denker <[email protected]> >>>>>>>>>>>> wrote: >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>>> On 10 Aug 2018, at 23:16, Tim Mackinnon <[email protected]> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>> Actually I think I figured that bit out - a bit clumsily - >>>>>>>>>>>>> (pointers appreciated) >>>>>>>>>>>>> >>>>>>>>>>>>> createMissingClassActionFor: aMessage in: aContext >>>>>>>>>>>>> |errorNode senderContext newClass variableNode | >>>>>>>>>>>>> senderContext := aContext sender. >>>>>>>>>>>>> errorNode := senderContext method sourceNodeExecutedForPC: >>>>>>>>>>>>> senderContext pc. >>>>>>>>>>>>> variableNode := errorNode receiver receiver. >>>>>>>>>>>>> >>>>>>>>>>>>> newClass := OCUndeclaredVariableWarning new node: variableNode; >>>>>>>>>>>>> defineClass: variableNode name. >>>>>>>>>>>>> aContext restart. >>>>>>>>>>>>> >>>>>>>>>>>>> However that last line is wrong, as it doesn’t restart with my >>>>>>>>>>>>> newly defined class - I also tried >>>>>>>>>>>>> >>>>>>>>>>>>> aContext restartWithNewReceiver: newClass >>>>>>>>>>>>> >>>>>>>>>>>>> But again, I get a debugger where my class is still bound to nil. >>>>>>>>>>>>> So what’s the trick to re-evaluate with the new class I’ve >>>>>>>>>>>>> created? Or maybe I’m totally on the wrong track (still its very >>>>>>>>>>>>> interesting…) >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> what is a bit bad is that you catch the problem “too late” (that >>>>>>>>>>>> is, the DNU to nil, not the read of nil), so nil is already pushed >>>>>>>>>>>> on the stack at this point. >>>>>>>>>>>> >>>>>>>>>>>> I tried it in the inspector and at least the class binding was >>>>>>>>>>>> correct after defining the class… do you have an image with the >>>>>>>>>>>> whole code to try? >>>>>>>>>>>> >>>>>>>>>>>> Marcus >>>>>> >>>>>> >>>>> >>>>> >>>> >>>> >>> >> >> > >
