Although it's perhaps not as important early on as Henry's excellent advice, I would like to advocate for good use of whitespace and grouping in J programming. Putting less space around parts which are evaluated first (generally adverbs) and more around those which are evaluated last makes it a lot easier to interpret the code and mentally group its parts together. So I would write (hoping for no line wrap)
isAnagramOf =: 0: ` ([: */ =&([: /:~@tolower ' '&i. # ])) @. (=&([: # ' '&i. # ])) Here I have replaced a few (@) constructions with ([:), as ([: u v) is equivalent to (u@:v) but frequently requires fewer distracting parentheses. Many programmers prefer (@:) instead, but it is a good idea to use (@:) unless there is an actual reason to use (@). I would probably further replace ([: # ' '&i. # ]) with (' '&i. #@:# ]), and subsequently realize that dyad (#@:#) is the same as (+/@:[), giving (' '&i. +/@:[ ]) or (' ' +/@:i. ]), and similarly group (*/) with (=) as (*/@:=), since this becomes an easily-understood idiom. The two concrete points here are: - Use whitespace to show precedence: tighter spacing around operators with less precedence. - Replace ([: u v@:w) with ([: u@:v w) when u and v are related. This holds for (&:) instead of (@:), and in monad and dyad forms. And the more general rule: pay attention to how your code is written! It can suggest a lot of relationships that help the reader (usually you) to understand what is happening. Marshall On Sun, Mar 13, 2016 at 03:21:15PM +0000, Adam Tornhill wrote: > Hi all, > I finally decided to try to understand this fascinating language. So far I've > spent some evenings reading and experimenting with the language. J is fun. > Real fun. I also like how J forces me to re-consider how I view programming. > Of course, that also means I'm still at a complete beginner's stage, so I'd > like to ask for some feedback and suggestions on my first J code. I'm sure > there's a lot I can simplify in my code. > Here's the code I put together by digging around in the J Dictionary: > isAnagramOf=:(0:`((*/)@(=&((/:~@tolower)@(' ' & i.#])))))@.(=&(#@:(' ' & > i.#]))) > > Some examples: > 'Nag a Ram ' isAnagramOf 'Anagram'1 > 'ab' isAnagramOf 'aa'0 > All tips and hints on both the code and learning J in general would be much > welcome. > Thanks!/Adam-- Homepage: www.adamtornhill.com Twitter: @AdamTornhill > Your Code as a Crime Scene: > https://pragprog.com/book/atcrime/your-code-as-a-crime-sceneLisp for the Web: > https://leanpub.com/lispwebPatterns in C: https://leanpub.com/patternsinc > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm