Well, I can rename the compile: method and post to PharoInbox, if anyone is interested.
Niko On Tue, Nov 3, 2009 at 5:19 PM, Gary Chambers <[email protected]> wrote: > +1 too. Fewer side-effects and/or more side-effect free refactoring is > better. > > Regards, Gary > > ----- Original Message ----- > From: "Igor Stasenko" <[email protected]> > To: <[email protected]> > Sent: Tuesday, November 03, 2009 3:56 PM > Subject: Re: [Pharo-project] Compiler compile: > > >> +1 Niko. >> There should be an easy interface for compiling the source code >> without installing the result into system. >> And of course, compiler should answer an instance of compiled method >> >> 2009/11/3 Niko Schwarz <[email protected]>: >>> Hi list, >>> >>> consider this code: >>> >>> c := Compiler compile: 'meth "bla" ^ 2'. >>> >> Try using >> >> c:= Compiler new >> compiledMethodFor: ... >> >> >> The class-side #compile:... method , is method which serves for >> directly compiling & installing the method into receiver. >> In the above case - into Compiler class, but you can also do that for >> any other class: >> >> MyClass compile: .... >> >>> Here, c will be set to the symbol #meth. And Compiler will be added a >>> new method "meth". >>> >>> This is of course counter-intuitive, but it's kind of wired into the >>> system. Behavior>compile: does certainly more than compile. It >>> compiles the code and adds it to itself, then returns the methodName >>> as a symbol. Without mirrors, it's hard to do it right, though. >>> >>> Also, there's an easy method to add a method to a class, but no easy >>> method to get a CompiledMethod object. I don't want to strongly >>> advocate for my change, I just want to offer it. Here's what I did in >>> my system: >>> >>> I changed Compiler>compile: to do the following: >>> class side: >>> >>> compile: aString onClass: aClass >>> ^ self new compiledMethodFor: aString onClass: aClass >>> >>> instance side: >>> >>> compiledMethodFor: textOrStream onClass: aClass >>> >>> | methodNode method | >>> class := aClass. >>> self from: textOrStream class: class context: nil notifying: nil. >>> methodNode := self translate: sourceStream noPattern: false ifFail: >>> [^self error: 'Compilation failed']. >>> method := methodNode generate: #(0 0 0 0). >>> self interactive ifTrue: >>> [method := method copyWithTempsFromMethodNode: methodNode]. >>> ^method >>> >>> This has its own problem, like: compile: suddenly has different >>> semantics on Compiler than anywhere else. Best might be renaming >>> Behavior>compile: to something more intuitive. Like >>> #compileFromAndAdd:. >>> >>> Cheers, >>> >>> Niko >>> >>> _______________________________________________ >>> Pharo-project mailing list >>> [email protected] >>> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project >>> >> >> >> >> -- >> Best regards, >> Igor Stasenko AKA sig. >> >> _______________________________________________ >> Pharo-project mailing list >> [email protected] >> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project > > > _______________________________________________ > Pharo-project mailing list > [email protected] > http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project > _______________________________________________ Pharo-project mailing list [email protected] http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
