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

Reply via email to