On Sat, May 26, 2018 at 8:07 AM, Denis Kudriashov <dionisi...@gmail.com> wrote:
> Hi > > 2018-05-26 8:46 GMT+03:00 Clément Bera <bera.clem...@gmail.com>: > >> Just mentioning another use-case: >> >> getDatabaseInstance >> ^ (Production CifTrue: [Database] CifFalse: [MockDatabase]) new >> > > I think following code will work: > > getDatabaseInstance > ^ (Production ifTrue: [Database] ifFalse: [MockDatabase]) > asMethodConstant new > > > Arf, obviously you try to work around the example. You can have anything in the block, not necessarily a constant. foo ^ Condition CifTrue: [self bar] CifFalse: [self baz] And I want the condition to be replaced by the contents of one block or the other, not just by a constant. >> >> >> Since I use conditional compilation more often than just precompiling >> constants. >> >> I don't see an equivalent of asMethodConstant AST manipulation at >> runtime strategy in the image for this case right now but it's probably a >> couple lines of code with Reflectivity. >> >> On Sat, May 26, 2018 at 7:28 AM, Clément Bera <bera.clem...@gmail.com> >> wrote: >> >>> >>> >>> On Fri, May 25, 2018 at 10:44 PM, Esteban Lorenzano <esteba...@gmail.com >>> > wrote: >>> >>>> >>>> >>>> On 25 May 2018, at 17:30, Clément Bera <bera.clem...@gmail.com> wrote: >>>> >>>> What about a preprocessor like the Java preprocessors ? The Truffle >>>> project relies heavily on that for high performance Java and it's quite >>>> nice. It's difficult to do that in Smalltalk right now. >>>> >>>> I think if you want to do what are asking for you just need to write a >>>> bytecode compiler extension. >>>> >>>> I did something similar in the past to have precomputed constants >>>> through AST manipulation at compilation time. You can find it here with >>>> examples: http://smalltalkhub.com/#!/~ClementBera/NeoCompiler. Once >>>> the code is loaded you need to recompile the examples (NeoCompilerExample >>>> withAllSubclassesDo: #compileAll.). With it you can write code such as: >>>> [ Smalltalk vm class ] Cvalue >>>> And depending if the compiler allowsPrecompilation or not, the bytecode >>>> compiler generates: >>>> Smalltalk vm class >>>> Or just a push literal with the precomputed value (the class >>>> VirtualMachine). >>>> >>>> >>>> this is not what #asMethodConstant provides? >>>> >>> >>> Can you turn asMethodConstant On and Off so you have the constant in >>> production and not a development time ? Typically at development time I >>> change the constants generated a lot and I don't want to waste time >>> recompiling all the time. >>> >>> But yeah, my project is from 2014. I guess instead of preprocessing you >>> could do everything at runtime with AST manipulation/recompilation like >>> in asMethodConstant. >>> >>> The main point of preprocessing IMO is to control performance, it's just >>> easier for me to just look at the generated bytecode and change the >>> preprocessor until it gets what I want, it's not always easy to run code >>> that will change your method at runtime quickly so you can look at the >>> bytecode generated. >>> >>> Anyway, I am not convinced at all something like that should be in the >>> base image. >>> >>> >>>> >>>> Esteban >>>> >>>> In the end I decided not to use this, but you can use it and extend it >>>> to support more than just constants (any AST manipulation is possible). >>>> Just checked it works in Pharo 6. >>>> >>>> On Fri, May 25, 2018 at 4:26 PM, Stephan Eggermont <step...@stack.nl> >>>> wrote: >>>> >>>>> Debiller 777 <ozovozovozo...@gmail.com> >>>>> wrote: >>>>> > Well, I've already asked about adding new literals to pharo or >>>>> Smalltalk in >>>>> > general, however this time I have a better idea: >>>>> > macros. Can they be added? Because if I understand correctly they >>>>> may be >>>>> > the only way to do that. >>>>> >>>>> Why do you think they would be a good idea? We have powerful >>>>> meta-programming facilities that are well understood and somewhat >>>>> supported >>>>> by tooling. How do we get value out of macros? >>>>> >>>>> Stephan >>>>> >>>>> >>>>> >>>>> >>>> >>>> >>>> -- >>>> Clément Béra >>>> https://clementbera.github.io/ >>>> https://clementbera.wordpress.com/ >>>> >>>> >>>> >>> >>> >>> -- >>> Clément Béra >>> https://clementbera.github.io/ >>> https://clementbera.wordpress.com/ >>> >> >> >> >> -- >> Clément Béra >> https://clementbera.github.io/ >> https://clementbera.wordpress.com/ >> > > -- Clément Béra https://clementbera.github.io/ https://clementbera.wordpress.com/