An update, I read about protocols and multimethods. I think multimethods 
are a decent way to go (cant use protocols without a defrecord) provided 
they work across namespaces. 

On Tuesday, April 15, 2014 11:52:36 AM UTC+12, Andrew Chambers wrote:
>
> Hi everyone, 
>
> I'm new to clojure and in order to learn I'm working on making some 
> compiler tools which converts a lightweight IR code into assembly.
>
> My data model for an IR function is along the lines of
> (def code
> {
>     :entry
>         [[:loadaddr :x "global_label"]
>          [:loadconst 1 :y]
>          [:add :x :y :z] 
>          [:jmp :exit]]
>     :exit
>         [[:ret :z]]
> })
>
> This, when translated to assembly and after register allocation would turn 
> into something like (ignoring calling conventions etc):
> (def assembly-code
> {
>     :entry
>         [[:x86.lea :eax "global_label"]
>          [:x86.loadimm 1, :eax]
>          [:x86.add32 :ebx :eax] 
>          [:jmp :exit]]
>     :exit
>         [[:ret]]
> })
>
> The problem arises when I have to query the IR code for things like 
> accesses-memory? or get-output-vars in an
> extensible way so that multiple target architectures can be supported.
> e.g.  (get-output-vars [:add :a :b :c]) -> :c
>         (get-output-vars [:x86.add :a :b]) -> :b ;; the input and output 
> positions are opcode specific
>         (get-output-vars [:x86.add :a :b]) -> :b
>         (get-output-vars [:divmod :a :b :c :d]) -> :c :d
>         (accesses-memory? :x86.add) -> false
>         (accesses-memory? :x86.load) -> true
>         (accesses-memory? :loadconst) ->false
> I have to be able to write these functions in a way that knows about the 
> format of the basic IR opcodes, but can also be extended
> to handle opcodes of architectures that don't exist in my code yet, the 
> extensions would exist within the namespaces of that specific architecture 
> and shouldn't need to modify the code for the built in opcodes.
>
> What is the most seamless and efficient way to achieve this sort of 
> function extension in clojure? Also, how would I allow sharing
> of implementations where instructions have similar layouts.
>
> e.g.
> (get-output-vars [:add :a :b :c]) -> :c
> (get-output-vars [:sub :a :b :c]) -> :c
>
>
>
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to