Hello,

I have been learning J for quite a while now, so I start feeling comfortable with it. However, I'm not using it in my everyday life as much as other programming languages for reasons that, I feel, are pretty dumb: the language in itself is great, but IMO the naming convention of the tools around it are bad; and compared to other interpreted languages, J's interpreter has a very poor interface / default behavior. I though about simply patching what I feel like is poor behavior, but I'm not even sure my PR would be accepted, so this is why I am writing on the forum. Am I the only one who feels this way, or would the J community be happy about such changes?

To do so, I will list here some major issues I have in my workflow with J, and I will try to provide some comparison examples with other programming languages that. Feel free to comment on whether any of these feel relevant, or utter nonsense, or anything else. I enough people seem to like any of these changes, I'll try to implement them; however, since I am not very familiar with C, and I am not familiar at all with J's sources, it might take a while: if you are inspired, don't hesitate to implement these changes yourself.

The issues aren't given in a particular order, some are more impactful than others.

 * The `ijs` extension. As far as I know, J used to have a `js`
   extension (which stood for J Script), but for obvious reasons this
   had to change, so it now uses `ijs` (which stands for Interactive J
   Script). I don't understand why J's extension is not simply `j`.
   After all, several programming languages whose name is a single
   letter have that letter as their extension (C, C's headers, Q, B, D,
   ...). Furthermore, I don't think a script is an appropriate name for
   a library, and it's even less appropriate to say it's "interactive".
   Finally, as far as I know, the `j` extension isn't used for anything
   else (in an impactful way). This change can be made in a
   backward-compatible manner (continue to accept `.ijs` files, maybe
   issue a warning about that extension being deprecated, and change
   the documentation so that `.j` becomes the official way to name J
   files).
 * `jconsole`. Similarly as before, there has been a name conflict with
   a Java debugger thing, and since Java won by popularity, it is now
   sometimes shipped as `ijconsole`. All the interpreted programming
   languages I can think of simply have the name of their language as
   the shell command to invoke their repl, why not J? Incidentally,
   this would bury the Java clash thing once and for all, which is
   quite problematic for packagers who can't rely on the name of the J
   interpreter being jconsole or ijconsole [for instance, in the Linux
   distribution I use, the REPL was shipped as jconsole, but the J
   plugin for my text editor tried to invoke it as ijconsole]. Some may
   say that a single-letter command is not a good thing. I did some
   research about that, I couldn't find any other command that is
   simply `j` and, furthermore, I found that Q's [a programming
   language similar to J] REPL was simply named `q`. Other alternatives
   could be `jl` (as in J Lang, which is also the naming convention of
   Clang, whose command is `cl` — and many programming languages append
   "Lang" to their name to clarify what they are [see julialang.org for
   Julia, rust-lang.org for Rust, Clang for C]), `ji` for J Interpreter
   (as opposed to the J compiler [see
   https://github.com/mattjquinn/jcompiler]). This change can be made
   in a backward-compatible manner, just distribute the REPL under the
   two names, optionally making it issue a warning when using `jconsole`.
 * Jconsole does not automatically exit when launched with a script in
   argument. I understand why this works like that: it's easy to debug
   a program, and it's easy to load a local library. However, this goes
   against the behavior of every other interpreted language: when you
   run a script, you don't expect it to additionally hang waiting for
   the `exit` instruction. Conversely, adding `exit''` at the end of
   your scripts make it impossible to load them as-is from within the J
   REPL. The behavior that I expect is that, if Jconsole is fed a
   single positional argument, then it must be a J script, which it
   runs, and then simply halts (as Python, Ruby, Scheme, Racket, Perl,
   Awk and all the others do). Otherwise, the REPL is started. If you
   want to load some scripts in your Jconsole session, use a named
   argument, like `jconsole --load myscript.ijs --load
   somethingelse.ijs`. This change would not be backward-compatible,
   but I don't feel it would be too bad, since I don't think any
   automated tool relies on the fact that you enter an interactive mode
   after having executed a J script, if it didn't call `exit` somewhere.
 * Jconsole doesn't have arguments. I know this can be a bit of a pain
   to implement at first, but nowadays it's really not that hard
   anymore to parse cli arguments in a proper way, and it's almost
   mandatory to at least have a `--help` with a brief description of
   *at the very least* what the command is, and a `--version`, which
   indicates which version of the software is installed. In addition,
   having arguments would allow the command to be a bit more flexible
   (see the issue above for an instance where arguments would be
   helpful). All the (decent) commands on my machine, or that I've ever
   tested, comply to this simple convention. This would obviously be
   backward-compatible.
 * Jconsole's prompt is spaces. This is usually not an issue and, in
   fact, is pretty nice once you get used to it. However, sometimes
   (when you are otherwise printing a lot of stuff), it makes sense to
   have the prompt stand out a little more. Currently, I'm not aware of
   any way to change it (besides patching the source code). Other
   prompts that would not be confusing would be alphabetical characters
   followed by a dot, since that would otherwise be parsed as a
   reserved keyword / builtin anyways. For instance, the prompt could
   be `J. `, `j. ` or `repl. `. Note that Q has a similar problem, and
   their prompt is `q)`, because that couldn't be code, but I
   personally don't really like it [see xkcd.com/859]. This change
   would be backward-compatible, because no (sane) automated tool
   relies on the prompt of an interactive command which has a
   non-interactive mode.
 * J's directories. J is the only language I know that occupies my home
   directory (with stuff like j903-user). On a Linux computer, that
   should definitively go into `~/.local/share/j` and `~/.config/j`, or
   maybe something like `~/.jrc`.
   Also, J's installation directories are a bit messed up. I'm not
   exactly sure what J expects, but when the binary wants a file named
   `profile.ijs` in the same directory, which in turn instructs J to
   find a directory named `system` in the parent directory. This is
   clearly not compliant with the FHS, because I expect the binary to
   be in `/usr/bin/jconsole`, the file `profile.ijs` (which looks like
   configuration) to be somewhere like `/etc/j/profile.ijs` and the
   `system/` directory, as with the `addons/` library, to be in
   `/usr/share/j/` (or maybe in `/lib/`). This kind of issues then
   hinder the packaging of J, which in turn make it hard to use it in
   my everyday life.
 * Packaging of add-ons. (Some) add-ons are, in fact, libraries. As
   such, their packaging should be left to the user, who should
   delegate this task to their favorite package manager. For instance,
   Python resolves finding libraries using the directories in
   `sys.path`. `sys.path` is populated, in turn, by:
     - the current directory;
     - directories in `PYTHONPATH`;
     - the default directories provided by the installation.
   This means it's easy to make installed libraries available, no
   matter who or what installed them, it's reliable and it's easy to
   understand what happens, and what to look for if a library is not
   found. Furthermore, Python ships with a minimalist package manager.
   If you want to use it, fine, it works. Otherwise, use whatever tool
   you want. J could still provide a package manager, as it currently
   does, but it would be great if J didn't assume every package was
   installed by it, or otherwise installed by mimicking by hand the
   behavior of its package manager. This issue, as well as the previous
   one, make it really hard to properly install and tweak J.
 * Jconsole doesn't have many (quite) standard shortcuts. Most
   word-skipping shortcuts that are usually available in a cli
   application (such as Alt-F to move forward of one word) will only
   trigger a newline in jconsole. This happens so often to me that I've
   stopped trying to edit a wrong expression, I just rewrite it
   entirely in fear that a shortcut would actually trigger an
   evaluation of the expression. Most modern cli applications support
   these, including python (and all its improved REPLs), racket, but
   not scheme, which just inserts the escaped version of the shortcut.
 * (this is not directly related to the implementation of J) Mailing
   lists are a good thing, but more modern solutions actually exist.
   Since J has a website, whose development seems to be quite active
   (the online IDE for instance is quite impressive), I think it would
   make sense to have a web forum. Free and open-source software for
   this kind of purposes, like Discourse, exist, and allow the
   integration of a mailing list: the forum offers the possibility to
   produce a digest like in a mailing list, or simply to receive
   messages and to answer through mails, completely transparently (that
   is, without any difference from a user who would simply use the web
   interface).

I am open for any remark on this list, including addendums or criticism. It's because I enjoy a lot coding in J that improving its ecosystem is important to me, so anything that goes in that direction is welcome.

Sincerely,

Adrien
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to