Hi Stef, Just a clarification. I do not argue here. I just explain what I see. I think it was like this since a long time. I even checked in an old VW I have around and it seems to have the same behavior. But, I do agree that it is not straightforward at all. It took me a while to figure this out and it is still confusing sometimes. In fact, this is why we have a String presentation in the String object - I needed something that clarifies situations like these. That does not mean it is the best solution :).
On Feb 19, 2017, at 11:42 AM, stepharong <stepharong@free.fr> wrote:
On Sun, 19 Feb 2017 11:40:04 +0100, Sven Van Caekenberghe <sven@stfx.eu> wrote:
Ah, you're right: there is a difference between printing a textual representation on a stream / window and doing the same with the actual (print)string. I was not yet fully awake I guess.
So 'comics'
comics whatever it means but (#AAA asClass new name: 'comics') âcomics'
Itâs the other way around :). Example A: 'comics' >>print it>> âcomicsâ In this case we have a string object and we send printString to it which in String>>storeOn: adds the quotes as part of the contents of the new string. Example B: (#AAA asClass new name: 'comics') >>print it>> comics Here we have an non-string object and we sent printString to it which creates a string with the contents of the stream. As no String>>storeOn: is invoked in this case, there are no quotes. So, the two resulting print it strings do not have the same contents. Maybe another case: Example C: (#AAA asClass new name: 'comicsâ) printString >>print it>> âcomicsâ This is equivalent to Example A. We send printString to a string object and we get the quotes. The issue is that when we send printString to a string, we produce a new string with escaped quotes: 'comics' = (String streamContents: [:s | s << 'comicsâ]) contents. "true" 'comics' = (String streamContents: [:s | s << 'comics']) contents printString. "false"
I'm sorry but I do not get it at all. Especially since we always wrote that printIt is sending printString. I find that totally broken and I do not understand why this is good.
Another thing to keep in mind is: Example D: Object new >>print it>> an Object This is essentially equivalent with Example A If Example B would produce >>print it>> âcomicsâ it would mean that Example D would produce >>print it>> âan Objectâ Ugh, I already got dizzy with so many quotes :). One problem is that when you look at a string, you do not know how many String>>storeOn: commands it went through. So, here is an idea: what if String>>printString would produce a EscapedString, which behaves like an operator? In this case, we would see better how many levels of String>>storeOn: are being displayed. What do you think? Cheers, Doru
Stef
On 19 Feb 2017, at 10:59, Tudor Girba <tudor@tudorgirba.com> wrote:
Hi,
Hmm, I think I do not see it :).
Letâs take it slowly. From what I see, the behavior is the same since at least Pharo 3.
Here is a script that seems to reproduce your situation:
Object subclass: #AAA instanceVariableNames: 'name' classVariableNames: '' package: 'AAA'. #AAA asClass compile: 'printOn: aStream aStream << name'. #AAA asClass compile: 'name: aString name := aString'. #AAA asClass new name: 'comics'
In Pharo 6, we have in a Playground:
<Screen Shot 2017-02-19 at 10.48.55 AM.png>
In Pharo 3, we have this in a Workspace:
<Screen Shot 2017-02-19 at 10.49.26 AM.png>
Calling Print It on an object produces a string out of the contents of the stream, and displaying it shows the contents of the stream (so, no quotes). Calling Print It on a string produces a string of the string, and displaying it shows the quotes of the first string.
You can see this in the String tab of the inspector:
<p1.png>
<p2.png>
Does this make sense?
I think this is not inconsistent, but maybe there is a better way. In any case, the behavior seems to exist since a long time.
Cheers, Doru
On Feb 19, 2017, at 9:06 AM, stepharong <stepharong@free.fr> wrote:
Hi doru
may be I do not see the obvious. I defined a class
Object subclass: #MFElement instanceVariableNames: 'name parent' classVariableNames: '' package: 'MyFS2'
printOn: aStream parent isNil ifFalse: [ parent printOn: aStream ]. aStream << name
name: aString name := aString
MFDirectory new name: 'comics'.
And when I do
(MFDirectory new name: 'comics') comics/
(MFDirectory new name: 'comics') printString
'comics/'
Hi Stef,
I think I do not understand the issue.
Here is the screenshot of a Playground.
âcomicsâ -> print-it -> âcomics'
<Mail Attachment.png>
What am I missing?
Cheers, Doru
On Feb 18, 2017, at 6:26 PM, stepharong <stepharong@free.fr> wrote:
Hi guys
I'm working on an introduction chapter for my future book and I do not like the behavior I see in latest pharo 60.
And I do not understand the behavior of print-it
(MFDirectory new name: 'comics') comics/
(MFDirectory new name: 'comics') printString
'comics/'
Why print it does not produce ''?
Stef
printIt "Treat the current text selection as an expression; evaluate it. Insert the description of the result of evaluation after the selection and then make this description the new text selection."
| printString | self evaluateSelectionAndDo: [ :result | printString := [ result printString ] on: Error do: [ '<error in printString: try ''Inspect it'' to debug>' ]. self afterSelectionInsertAndSelect: printString ]
-- Using Opera's mail client: http://www.opera.com/mail/
-- www.tudorgirba.com www.feenk.com
"It's not how it is, it is how we see it."
-- Using Opera's mail client: http://www.opera.com/mail/ <MFElement.st>
-- www.tudorgirba.com www.feenk.com
"Problem solving should be focused on describing the problem in a way that makes the solution obvious."
-- Using Opera's mail client: http://www.opera.com/mail/
-- www.tudorgirba.com www.feenk.com "From an abstract enough point of view, any two things are similar."