Pharo does have something like full text search across all methods, and it works like this: Rightclick the text you'd like to search for, and choose "extended search" from the options. Then, choose "method source with it." A progress bar will appear, and you should get your answer within a minute. That has to do with the source not being loaded into Pharo at all times, it is read on demand out of the sources file.
However, the compiled sources are in memory from the start. While you can't meaningfully search compiled sources, you can search the string literals within. Again, rightclick the text you'd like to search for, and choose "extended search" from the options. But now, choose "method strings with it." That will bring up a list of all methods that contain the selected text as a string literal—instantly.
Here I'll post things related to my research that don't fit in 140 characters (twitter.com/nes1983), as well as programming-related things that I do and come across.
Wednesday, October 27, 2010
Tuesday, October 12, 2010
One of my most-hated methods in Pharo
TestCase>fail
^self assert: false
What's wrong? Well, I often write
self fail
at the end of a unit test to remind myself that the test isn't yet done. Now, if I run the test, I care whether an assertion failed or whether the test solely failed. Of course I have no right to expect should detailed feedback from a test runner. But at least I shouldn't be misinformed. But that's exactly what happens. The TestRunner reports that an assertion failed if you call fail, even if none did.
Why's the Smalltalk debugger not focused on more in Smalltalk IDEs?
I can't help but wonder why Smalltalk's lovable trait of letting you develop in the debugger isn't leveraged far more by the IDEs. Suppose you just noticed that a method call doesn't have enough arguments. That is, you wrote this:
But you should have written:
Well now, that's a fantastic situation for refactoring, isn't it? You could automatically rename the method in the receiver, and you'd know quite precisely who that receiver is. Little of that is leveraged. But of course, if Smalltalk is to play any serious role in the future, we should play by our strengths.
Well, here's a strength: the most powerful debugger in any modern IDE.
self doSomething.
But you should have written:
self doSomethingWith: anArgument
Well now, that's a fantastic situation for refactoring, isn't it? You could automatically rename the method in the receiver, and you'd know quite precisely who that receiver is. Little of that is leveraged. But of course, if Smalltalk is to play any serious role in the future, we should play by our strengths.
Well, here's a strength: the most powerful debugger in any modern IDE.
Friday, October 8, 2010
A more robust doesNotUnderstand:?
Smalltalk makes it really convenient to write code in the debugger. So, how I often work is as follows:
Well, that's alright as far as it goes, but you can't work like that with
If you now call a non-existing method on an object of a thus modified class, you've built an endless recursion that is so close to the VM that you can't get into a debugger anymore.
Smalltalk's
Do you know a more robust implementation?
- Write a rough skeleton that calls "self fail" at some point.
- Write a unit test that calls the skeleton with real data.
- Finish the skeleton in the debugger, where I have test data right at hand to see if things work as intended.
Well, that's alright as far as it goes, but you can't work like that with
doesNotUnderstand:
methods.doesNotUnderstand: aMessage
self fail.
If you now call a non-existing method on an object of a thus modified class, you've built an endless recursion that is so close to the VM that you can't get into a debugger anymore.
Smalltalk's
doesNotUnderstand:
method is a dangerous superpower. And perhaps that's why just about nobody overwrites it in a standard Pharo image. Open problems
Do you know a more robust implementation?
- Non-existing calls inside the handler for such should be caught, I think.
- It should work nicely with code completion. (Code completion seems to be an integral part of just about every current approach to help programmer's productivity, so it better work nice.)
Friday, October 1, 2010
expandMacrosWith:
In Pharo, there's a very useful method
String>expandMacrosWith:
, virtually without documentation. It's much like printf in C. I guess it's easily understood from a few examples, so here go:
"<1s> is replaced by the first argument, a string.
<n> is a newline, <t> is a tab.
% escapes brackets."
'<1s><n><t>%<inject><n><t>^<1s>' expandMacrosWith: 'player'
➔
'player
<inject>
^player'
"p calls printString":
'<1p>' expandMacrosWith: #(1 2 3)
➔
'#(1 2 3)'
"? prints one string or another, depending on a Boolean"
'Dear <1?Mr:Mrs> <2s>, your contract has expired.'
expandMacrosWith: false with: 'Smith'
➔
'Dear Mrs Smith, your contract has expired.'
Subscribe to:
Posts (Atom)