Hi. While idea looks cool it will require a lot of tool support. Senders, var/class references, rename refactorings should be aware of it
2017-10-03 17:29 GMT+02:00 Damien Pollet <[email protected]>: > On 3 October 2017 at 14:07, Guillermo Polito <[email protected]> > wrote: > >> Why not having an opal plugin? >> >> The opal plugin may read strings in the form: >> >> "lalala {some expression} lololo" >> >> and replace at compile time that by: >> >> "lalala {1} lololo" format { some expression } >> > > If we're going to extend the compiler, we might as avoid parsing at > runtime by desugaring more like: > > String streamContents: [:str | > str > nextPutAll: 'lalala '; > nextPutAll: (some expression) printString; > nextPutAll: ' lololo' ] > > The thing to think about is what is the delimiter for {some expression}. >> - a too used one may break lots of existing code. >> > > …or we could change the string quotes to mean "dynamic string in which > interpolations can be used" and keep single quotes for literal strings only. > > - and we should escape it >> > > indeed > > >> On Fri, Sep 29, 2017 at 5:40 AM, Sven Van Caekenberghe <[email protected]> >> wrote: >> >>> >>> >>> > On 29 Sep 2017, at 08:54, Pavel Krivanek <[email protected]> >>> wrote: >>> > >>> > This solution will not work for environments without sources too where >>> names like t1, t2 are used for temporary variables. >>> >>> That is true. >>> >>> I often wonder why we can't keep at least the variables names, it would >>> not be that expensive. There was this problem with FFI that needed source >>> code access as well. It would also help the debugger and make the >>> decompiler more powerful. >>> >>> > Anyway, nice idea. >>> > >>> > -- Pavel >>> > >>> > Dne čtvrtek 28. září 2017 Sven Van Caekenberghe <[email protected]> >>> napsal(a): >>> > Hi, >>> > >>> > I got into a little office discussion about string interpolation as it >>> is done in different programming languages. >>> > >>> > In Pharo we have String>>#format: which is pretty nice. It works as >>> follows: >>> > >>> > | x y | >>> > x := 123. >>> > y := #foo. >>> > 'x={1} and y={2}' format: { x. y }. >>> > >>> > It is also possible to use a dictionary with keys, like this: >>> > >>> > | x y | >>> > x := 123. >>> > y := #foo. >>> > 'x={x} and y={y}' format: { #x->x. #y->y } asDictionary. >>> > >>> > But this is not true string interpolation as described in [ >>> https://en.wikipedia.org/wiki/String_interpolation ]. The idea is to >>> write the value generating expressions directly inside the strings. >>> > >>> > Since in Pharo we add features not by extending the syntax but by >>> adding messages I wondered if it could be done for string interpolation. >>> The goal is to make the following work: >>> > >>> > | x y | >>> > x := 123. >>> > y := #foo. >>> > 'It seems x equals {x} and y equals {y} while Pi is still {Float pi}' >>> interpolate. >>> > >>> > => 'It seems x equals 123 and y equals foo while Pi is still >>> 3.141592653589793' >>> > >>> > Here is the implementation I came up with: >>> > >>> > String>>#interpolate >>> > "Format the receiver by interpolating the evaluation of expressions >>> > in between curly brackets in the context of the sender as in the >>> following 3 oneline examples. >>> > 'Today is {Date today}' interpolate. >>> > | x | x := 123. 'x equals {x} and pi equals {Float pi}' interpolate. >>> > 'In {#strings} you can escape \{ by prefixing it with \\' >>> interpolate." >>> > >>> > | senderContext | >>> > senderContext := thisContext sender. >>> > ^ self class new: self size streamContents: [ :out | | stream | >>> > stream := self readStream. >>> > [ stream atEnd ] whileFalse: [ | currentChar | >>> > (currentChar := stream next) == ${ >>> > ifTrue: [ | expression result | >>> > expression := stream upTo: $}. >>> > result := Compiler new >>> > evaluate: expression in: senderContext to: nil >>> notifying: nil ifFail: [ ^ nil ] logged: false. >>> > out nextPutAll: result asString ] >>> > ifFalse: [ >>> > currentChar == $\ >>> > ifTrue: [ stream atEnd ifFalse: [ out nextPut: stream >>> next ] ] >>> > ifFalse: [ out nextPut: currentChar ] ] ] ] >>> > >>> > It is a hack that could certainly be improved. And there is of course >>> an obvious security problem. >>> > >>> > Thoughts ? >>> > >>> > Sven >>> > >>> > >>> >>> >>> >> >> >> -- >> >> >> >> Guille Polito >> >> Research Engineer >> >> Centre de Recherche en Informatique, Signal et Automatique de Lille >> >> CRIStAL - UMR 9189 >> >> 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 <+33%206%2052%2070%2066%2013> >> > > > > -- > Damien Pollet > type less, do more [ | ] http://people.untyped.org/damien.pollet >
