Recs.
Updated
Specs
Pros
Pro J engine can be embedded in other languages
The J interpreter is highly amenable for embedding in another language, e.g. via sockets and with JSON as a lingua franca. Namely because of: REPL interpreter that needs no GUI, low footprint, tradition of low dependency on external libraries,, terse commands that fit in short strings, etc. J comes with an example of how to do this in Python. This is useful for reusing / sharing / distributing / wrapping up a headless application or an algorithm. Incidentally, this reduces the risk of investing in J for an organization that prefers relying on a more mainstream language as its staple diet.
Pro Objects for programming in the large
The module / namespace management facility also enables a form of object-oriented programing useful for building large applications, or in the J context for alleviating the need to pass around and re-validate arguments, which are the untyped possibly complex nested arrays that give the language its power.
Pro Ultimate infix notation facilitates thinking
Whilst Lisp and Forth use pure prefix and postfix notations, respectively, J fully expands on the infix notation. All functions behave like operators in mainstream languages and there is no distinction between the two, they are both known as verbs. Part of the J game is about distinguishing between real variables (right hand side) and the context (optional left hand side), which forces you to gain an insight into your problem. The resulting syntax (with nouns, verbs, pronouns etc.) results in J sentences that bear some resemblance to sentences in a natural language.
Pro Seamless integration with tabular databases
The Jd database add-on (commercial for commercial use) extends J with an SQL-like facility which can be used for optimizing memory use for big data, managing complexity through use of multiple views etc. Since the world views of the relational model and array programming overlap, the level of integration is superb.
Pro Helps you think in terms of your problem space
Most of the time you think directly in terms of your real world problem (whatever your trade is), sometimes you think in terms of fundamental concepts such as maths or pure science, and only occasionally do you feel you are programing, particularly when working in interactive mode (as opposed to developing an application). Loopless programing, lack of type declarations, having at your fingertips a wide set of primitives that can all be applied to complex nested arrays all keep you focused at the right abstraction level.
Pro Compiled language speed from interpreted language
Each built in operator is a C/asm function, and special code further optimizes some operator combinations. Result is optimized C speed from quick parsing. Array orientation parses and compiles a function once, and applies it to all array items.
Cons
Con Documenting your code is not optional
Undocumented J can be hard to read. Luckily J comes with tool such as a simple tutorial system, a code report generator based on comments in the code and a code dissector. By generously using assertions and examples from unit tests, and adding some external markdown with a few DFD and UML tables, sound documentation is an achievable goal.