Multimethods are fantastic and do indeed work across namespaces if by "across namespaces" you mean you can defmethod in ns2 a defmulti in ns1.
On Tuesday, April 15, 2014 2:56:30 AM UTC+1, Andrew Chambers wrote: > > 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.