Can somebody propose an implementation besides on top of this discussion? I
propose such an implementation should take the form of a stream decorator
instead of changing the base implementation.

Guille

On Sun, Aug 6, 2017 at 12:01 AM, Peter Uhnak <i.uh...@gmail.com> wrote:

> Hi,
>
> just to (hopefully) clarify my intention, maybe pseudocode would describe
> my thoughts better.
>
> Stream>>beForWindows
>         "Use consistenly Windows line endings (CRLF) in the stream"
>         self convertLineEndings: true
>         lineEnding := String crlf
>
> Stream>>convertLineEndings: aBoolean
>         "automatically convert line endings to the predefined one"
>         convertLineEndings := aBoolean
>
> Stream>>nl
>         self nextPutAll: lineEnding
>
> Stream>>cr
>         convertLineEndings ifTrue: [
>                 self deprected: 'Using #cr/#lf for generic newlines is
> deprected, use #nl instead".
>                 self nl.
>         ] ifFalse: [
>                 self nextPutAll: String cr.
>         ]
>
>
> So when "convertLineEndings = true", then using anything else than #nl
> would warn the user that they should use #nl instead (as they explicitly
> requested to have the line endings consistend).
>
> And when "convertLineEndings = false", it would behave pretty much the
> same way as now, #cr would write #cr, etc.
>
>
> With such approach imho
>
> * output of existing code wouldn't be broken
> * when switching to new scheme (#nl) the programmer would be warned where
> the missed a change
> * it will be easier to keep the newlines consistent
>
> Peter
>
> On Sat, Aug 05, 2017 at 11:30:58AM +0200, Esteban Lorenzano wrote:
> >
> > > On 5 Aug 2017, at 11:17, Peter Uhnak <i.uh...@gmail.com> wrote:
> > >
> > >> I think there is a consensus we need to keep #cr and #lf as intended
> > >
> > > Is there?
> > >
> > > My argument was that there's no (obvious) reason to combine different
> line endings in the same document. Therefore if you were to use #cr, #lf,
> #crlf, you would actually mean that you just want to enter newline.
> >
> > no, sometimes you want to enforce a specific line ending. You will not
> mix, but you will not use the one from platform. Also, sometimes you
> actually can use #cr and #lf different as their immediate, common use (I’ve
> seen some weird exporting formats).
> >
> > >
> > > Similar problem arises when you would write a multiline string:
> > >
> > > stream nextPutAll: 'first line with enter
> > > second line'.
> > >
> > > Stored in method this will most likely contain Pharo's internal
> representation (#cr), even though you just want a new line, and not
> specifically #cr. (I've lost count how many times tests on CI failed
> because of this.)
> > >
> > > Considering the above, my opinion is:
> > >
> > > 1) by default #cr, #lf, #crLf, #nl (#newLine) will write whatever is
> globally configured for the stream (#beFor*)
> >
> > No, I strongly disagree.
> > #cr and #lf are ascii characters and should not be redefined.
> >
> > > 2) if one wanted to combine different line endings in the same stream,
> there should be an option to disable autoconversion. (Stream>>
> noNewLineAutoconversion)
> > >
> > > If (1) is much more common than (2), then imho autoconversion should
> cause no issues.
> > > If (1) is NOT that much more common than (2), then autoconversion
> wouldn't be beneficial.
> > >
> > > Autoconversion could also make transition easier because existing code
> will suddenly work as intended here without breaking anything (hopefully).
> >
> > Sorry, I do not see what this approach solves than the other one does
> not (and as I see, this one is a lot more complicated and prone to
> confusion).
> >
> > cheers,
> > Esteban
> >
> > >
> > > Peter
> > >
> > >
> > > On Sat, Aug 05, 2017 at 10:49:02AM +0200, Esteban Lorenzano wrote:
> > >> I think there is a consensus we need to keep #cr and #lf as intended,
> yet to add some kind of #newLine (which btw is different to EOL :P)
> vocabulary, isn’t?
> > >>
> > >> In this, I favour Peter approach for define line ending convention
> (the way #newLine will work)… and of course by default it should use the
> one from the current platform.
> > >>
> > >> anything agains this approach?
> > >>
> > >> Esteban
> > >>
> > >>
> > >>> On 4 Aug 2017, at 23:48, Tudor Girba <tu...@tudorgirba.com> wrote:
> > >>>
> > >>> +1.
> > >>>
> > >>> We need a basic representation of those characters. Logical ones
> should be derived from the simple ones.
> > >>>
> > >>> Doru
> > >>>
> > >>>
> > >>>> On Aug 4, 2017, at 3:44 PM, Esteban Lorenzano <esteba...@gmail.com>
> wrote:
> > >>>>
> > >>>>
> > >>>>> On 4 Aug 2017, at 15:41, Damien Pollet <damien.pol...@gmail.com>
> wrote:
> > >>>>>
> > >>>>> I agree with Pablo, #cr and #lf should not be clever and just be
> names for the carriage return and linefeed characters/codepoints.
> > >>>>
> > >>>> +1
> > >>>>
> > >>>>>
> > >>>>> Making #newLine's behavior dependent on the current platform
> disturbs me, though. I'd rather have:
> > >>>>>
> > >>>>> Stream >> newLineFor: platform
> > >>>>>   self nextPutAll: platform lineEnding
> > >>>>>
> > >>>>> Stream >> newLineForCurrentPlatform
> > >>>>>   self newLineFor: OSPlatform current
> > >>>>>
> > >>>>> Stream >> newLineForWindows "convenience for the most common
> platforms
> > >>>>> Stream >> newLineForUnix
> > >>>>> Stream >> newLineForHistoricReasons
> > >>>>>
> > >>>>> Stream >> newLine
> > >>>>>   "delegates to one of the above, I'd argue for unix for
> convenience, but windows is the technically correct combination of cr + lf,
> and cr only is the historic one"
> > >>>>>
> > >>>>>
> > >>>>> On 4 August 2017 at 14:25, teso...@gmail.com <teso...@gmail.com>
> wrote:
> > >>>>> To me it is clear that cr and lf should be in streams. But they
> should put the 'cr' or 'lf' character only. And of course the platform
> independent newline should be also.
> > >>>>>
> > >>>>> The first (cr, lf) should be used by the code wanting to have
> absolute control of what is in the stream. The later (newline) when you
> just want a new line.
> > >>>>>
> > >>>>> The two have completely different behaviour, ones are really low
> level, the other is higher level.
> > >>>>>
> > >>>>> On 4 Aug 2017 14:20, "Esteban Lorenzano" <esteba...@gmail.com>
> wrote:
> > >>>>>
> > >>>>>> On 4 Aug 2017, at 14:06, Stephane Ducasse <
> stepharo.s...@gmail.com> wrote:
> > >>>>>>
> > >>>>>> Well. This is not implemented like that in Pharo.
> > >>>>>>
> > >>>>>> cr is bad because it does not mean that it is independent of the
> platform.
> > >>>>>> So cr can be redefined as newLine and keep but not used inside
> the system.
> > >>>>>
> > >>>>> sometimes you actually want to write a cr (or a lf). So it needs
> to remain in the system, of course.
> > >>>>> now, including #newLine can be cool (most of the times you want
> the “platform compatible” new line). Also I would consider including #nl,
> abbreviated… just for convenience :P
> > >>>>>
> > >>>>> Esteban
> > >>>>>
> > >>>>>>
> > >>>>>> Stef
> > >>>>>>
> > >>>>>> On Fri, Aug 4, 2017 at 12:50 PM, Jan Vrany <jan.vr...@fit.cvut.cz>
> wrote:
> > >>>>>>> On Fri, 2017-08-04 at 12:03 +0200, Stephane Ducasse wrote:
> > >>>>>>>> Hi guys
> > >>>>>>>>
> > >>>>>>>> While writing pillar code, I ended up using "stream cr" and it
> > >>>>>>>> worries
> > >>>>>>>> me to still expand usage
> > >>>>>>>> of a pattern I would like to remove.
> > >>>>>>>>
> > >>>>>>>> Let us imagine that we would like to prepare the migration from
> cr.
> > >>>>>>>> I was thinking that we could replace cr invocation by newLine
> so that
> > >>>>>>>> after newLine
> > >>>>>>>> could be redefined as
> > >>>>>>>>
> > >>>>>>>> Stream >> newLine
> > >>>>>>>>     self nextPutAll: OSPlatform current lineEnding
> > >>>>>>>>
> > >>>>>>>>
> > >>>>>>>> what do you think about this approach?
> > >>>>>>>
> > >>>>>>> Why not? But please keep #cr.
> > >>>>>>>
> > >>>>>>> Section 5.9.4.1 of ANSI reads:
> > >>>>>>>
> > >>>>>>> Message: cr
> > >>>>>>>
> > >>>>>>> Synopsis
> > >>>>>>> Writes an end-of-line sequence to the receiver.
> > >>>>>>>
> > >>>>>>> Definition: <puttableStream>
> > >>>>>>> A sequence of character objects that constitute the
> implementation-
> > >>>>>>> defined end-of-line sequence is added to the receiver in the same
> > >>>>>>> manner as if the message  #nextPutAll: was sent to the receiver
> with
> > >>>>>>> an argument string whose elements are the sequence of characters.
> > >>>>>>>
> > >>>>>>> Return Value
> > >>>>>>> UNSPECIFIED
> > >>>>>>> Errors
> > >>>>>>> It is erroneous if any element of the end-of-line sequence is an
> > >>>>>>> object that does not conform to the receiver's sequence value
> type .
> > >>>>>>>
> > >>>>>>> my 2c,
> > >>>>>>>
> > >>>>>>> Jan
> > >>>>>>>
> > >>>>>>>>
> > >>>>>>>> Stef
> > >>>>>>>>
> > >>>>>>>
> > >>>>>>
> > >>>>>
> > >>>>>
> > >>>>>
> > >>>>>
> > >>>>>
> > >>>>> --
> > >>>>> Damien Pollet
> > >>>>> type less, do more [ | ] http://people.untyped.org/damien.pollet
> > >>>>
> > >>>
> > >>> --
> > >>> www.tudorgirba.com
> > >>> www.feenk.com
> > >>>
> > >>> "Presenting is storytelling."
> > >>>
> > >>>
> > >>
> > >>
> > >
> >
> >
>
>


-- 



Guille Polito


Research Engineer

French National Center for Scientific Research - *http://www.cnrs.fr*
<http://www.cnrs.fr>



*Web:* *http://guillep.github.io* <http://guillep.github.io>

*Phone: *+33 06 52 70 66 13

Reply via email to