> On 03 May 2016, at 13:58, Victor RENE <
[hidden email]> wrote:
>
> | f g h |
> f := '[ :a | ^a + 1 ].'. " Message pattern expected "
> g := '| b |'. " '|' expected "
> h := '| b ||'. " Success?!? "
> OpalCompiler compile: f.
> OpalCompiler compile: g.
> OpalCompiler compile: h.
>
#compile: expects a complete method… it creates a compiledMethod object.
To parse the AST of an expression with the OpalCompiler facade, this is for now:
OpalCompiler new
source: '[ :a | ^a + 1 ].';
parseExpression
Or you can use the parser directly:
RBParser parseExpression: '[ :a | ^a + 1 ].’
(I am not yet happy with the compiler API… but we can only really change it after we get rid of the old one.
The current design is mostly driven by backward compatibility).
> Basically I went from writing a function to clean up StringMorphs on the World...
>
> cleanupStringMorph
> "Clean up string morph in world."
> | x y |
> x := World submorphs.
> y := [ x select: [ :each | (each isMemberOf: StringMorph) ] ].
> y value do: [ :each | each delete ].
> Smalltalk garbageCollect.
>
> ...to wondering how to generalize the idea (pass the class as an argument)...
> ...but that would be too easy, so why not manipulate the AST programatically…
Yes, possible, but one should only do it if another solution is not possible.
> I read
https://marcusdenker.de/publications/Bera13a-OpalIWST.pdf but the compiler
> thinks I am a fool :-(
>
> My guess is I need to know what are the method calls from text to AST to bytecode.
> Any idea?
>
Bytecode is created for methods. So that means you first need to make sure to build
a RBMethodNode.
expression := RBParser parseExpression: '^[ :a | a + 1 ].'.
method := RBMethodNode
selector: #myMethod
body: expression asSequenceNode.
compiledMethod := method generate.
(compiledMethod valueWithReceiver: nil arguments: #()) value: 2.
Marcus