From J Wiki
Jump to navigation Jump to search


Before using these scripts you will need to ensure they have been installed. This can be done on a connected machine through J's package manager, or from the command line:

   load 'pacman'
   'install' jpkg 'general/misc'

If you are working offline and need to install these scripts you will need to obtain a copy of an archive containing them and unpack it in J's addons directory.

You can find the absolute location of these scripts using jpath. For example, on windows, you might get behavior like this:

   jpath '~addons/general/misc/prompt'

Usually, require is sufficient to use any of these scripts within a session, for example:

   require 'numeric validate'
   1 (],roundbanker,:rounddist) 0.1*?10#100
9.4 8.2 3.5 7.9 9 2.3 8.1 5.2 6.7 3.4
  9   8   4   8 9   2   8   5   7   3
  9   9   3   8 9   2   8   6   6   4
   ismatrix 1 (],roundbanker,:rounddist) 0.1*?10#100

If open and edit are defined in your session, they can be useful for inspecting the code. For example:

   open 'general/misc/jdll'
   edit 'roundbanker'

If edit is not defined but open is, you could use, for example:

   open (4!:4<'roundbanker'){4!:3''

... and then search for the definition of roundbanker within that file. (This lets you read the comments on the code, if there are any.)


May also be referred to as 'general/misc/guid'

Create guids in various formats

All guid verbs take the prefix of the shape of guids to return, eg

   require 'general/misc/guid'
   $guids $0     NB. create guid as a 16-byte character string
   $guids 2 3    NB. create 2x3 array of 16-byte strings
2 3 16
guids return guids as 16-byte strings
guidsn return guids as 24-character file names
guidsr return guids as 36-character strings, without braces
guidss return guids as 38-character strings, with braces
guidsx return guids as extended precision integers


May also be referred to as 'general/misc/inverted'

See: Essays/Inverted Table


May also be referred to as 'general/misc/numeric'

Various numeric utilities

baserep y in base x
clean clean y to tolerance of x (default 1e_10)
colsum sum data columns of matrix by key
e.g. if column 2 of mat is age, then
   2 colsum mat
sums the remaining columns by age
groupndx group indices of y in x
x is an integer vector of the starting numbers of each group,
assumed to be in ascending order. e.g.
   0 3 6 groupndx i.8
0 0 0 1 1 1 2 2
int01 interval in n steps from 0 to 1 (= steps 0 1,n)
linsert linear insert x (default 2) steps into y
randomize sets a random value into random link
range range from a to b [in steps of c]
recur solves recurrence r(i)=a(i)+r(i-1)*m(i-1)
if: r = m recur a
 r(0) = a(0)
 r(i) = a(i)+r(i-1)*m(i-1)
 m is repeated cyclically as necessary, e.g.
   1.05 1.10 recur 100 100 100 100 100
100 205 325.5 441.775 585.953
round round y to nearest x (e.g. 1000 round 12345)
roundbanker round y to nearest x with bankers rounding
rounddist round y to nearest x preserving total, e.g.
   0.1 rounddist 6$0.45
0.5 0.4 0.5 0.4 0.5 0.4
rounddown round y down to nearest x
roundint round to nearest integer
roundup round y up to nearest x
steps steps from a to b in c steps


May also be referred to as 'general/misc/pack'

Package utilities

a package is a 2-column matrix of: name, value that can be used to store nouns, or otherwise associate names and values.

A name is any character vector. pack and pdef work only when the names are proper J names.

definitions for nouns only:

  pk=. pack nl create package from namelist
  nl=. pdef pk define package

definitions for any names:

  text=. pk1 pcompare pk2 compare packages
  val=. name pget pk get value of name in package
  pk=. new pset old merge new and old packages
  pk=. nl pex pk remove namelist from package
  pk=. nl psel pk select namelist from package
  res=. packlocale locs package all nouns in locales


May also be referred to as 'general/misc/parts'

Partition functions

Partitions are typically given by a boolean with 1's marking the beginning or end of each partition. Partitions are also sometimes given in terms of the lengths of each partition.

Verbs defined here assume that boolean 1's mark the beginning of each partition - see comments at the end for examples of end-partition verbs.

The verbs psum and psumscan illustrate definitions appropriate for verbs that return scalar or non-scalar results, respectively. utility used to build non-scalar partition functions:


   require 'general/misc/parts'
   firstones 1 1 0 1 1 1 0
1 0 0 1 0 0 0
   lastones 1 1 1 0 1
0 0 1 0 1
   lfp 1 0 1 0 0 1
2 3 1
   partition 1 9 9 4 4 4 9
1 1 0 1 0 0 1
   runindices 3 1 2 1
0 0 0 1 2 2 3
   runlengths 1 9 9 4 4 4 9
1 2 3 1

   x=: 1 0 1 0 0
   y=: 5 3 2 2 7

   x preverse y
3 5 7 2 2
   x psort y
3 5 2 2 7
   x psum y
8 11
   x psumscan y
5 8 2 4 11


May also be referred to as 'general/misc/trace'

Execution trace utilities

The main functions are "trace" and "paren".

x trace y trace sentence y to x levels of function calls
trace y same as _ trace y

For example:

   require 'trace'
   trace '3+i.4'
 --------------- 1 Monad ------
 0 1 2 3
 --------------- 2 Dyad -------
 0 1 2 3
 3 4 5 6
3 4 5 6

Tracing provides information on results within a line; the action labels 0 monad, 1 monad, 9 paren, etc., are from the parse table in Section II.E of the J dictionary.

paren y fully parenthesize sentence y

For example:

   require 'trace'
   paren '+/i.4'
   paren '(3 4$i.12)+/ .**:i.4'
((3 4$(i.12))((+/) .*)(*:(i.4)))

See also: Scripts/Tracer


May also be referred to as 'general/misc/validate'

Data validation functions

data validation

verbs return 1 if true, 0 if false

data type verbs check the data, not the internal representation. For example, 1j1-0j1 is considered boolean, though stored as complex.


   require 'general/misc/validate'
   5 10 inrange i.12

   '()' isbalanced '(123(45))'

The provided verbs are:

inrange (low, high) inrange data
isbalanced pair isbalanced string
isboolean data is all 0 or 1
isboxed is boxed
ischaracter data is character
iscounter data is non-negative integer (counting number)
iscomplex data is complex
isdate is date (as yyyy mm dd)
isempty data is empty
isinteger data is all integer
ismatrix data is a matrix
isnumeric data is numeric
isrational data is rational
isreal data is all real
isscalar data is a scalar
isunicode data is unicode
isunique data has no duplicates
isutf8 text is valid UTF-8
isvector data is a vector


These scripts do not have short aliases.

So, for example,    require 'general/misc/format general/misc/prompt' but not:    require 'format prompt'


Handle files larger than 2^31 bytes (for 32 bit windows).


microsoft windows specific alternative to wd'clippaste'.

See: Guides/Clipboard

See also: Guides/Window Driver/Command Reference, Addons/gui/droidwd, and Addons/gui/gtkwd




Supposedly support for beginners to write code in "a more literate style".

Needs considerably more documentation (book(s), lab(s), tutorial(s), etc...) for this approach to be accessible to beginners. So far, all we have is Guides/Primitives


This script allows you to see how hooks, forks, and other structural elements affect the order of processing verbs.

First, select the kind of display you want with 'setfnform'.

The operands are 'math' (display like f(x,y)), 'J' (display like x f y), and 'Jv' (like J, but monads are followed by '_' and dyads are preceded and followed by '_'). Example:

   require 'general/misc/fndisplay'
   setfnform 'math'

Then, define the verb-names you want to use:    defverbs 'f g h'

Finally, define any names you want to use for nouns:    defnouns 'x y'

Then, entering combinations of your verbs and nouns will show you how the combinations will be executed.

By default a verb has infinite rank; you can append "r to a verb-name in defverbs to assign the rank r to the verb.


   x f&.g y

where g` means the inverse of g.

See also: Vocabulary/Dissect or 'trace'


Utilities to manipulate font family names.

See: Guides/Window Driver/Fontspec

This is similar to but not quite the same.


Formatting utilities

center width center text
clipfmt format data for clipboard
clipunfmt unformat data read from clipboard
colhdr column headers
expandby expand data with fit value
expandn expand data at every nth item
flatten flatten array to a character string
fold fold text to width
hexdump show text as hex and ascii characters
nfmt simple numeric formatter
ruler returns formatted ruler
sqzint squeeze list of positive integers into short form
sqzrun squeeze list of numbers into short form
xfmt format extended integers


This script gives examples of calling the J DLL from J. Similar routines may be written in other languages that can call DLLs.

The internal representation used is that for intel machines.

main definitions:

jclear clear J session
jcmd send sentence, return result
jdo send sentence to be executed
jget retrieve value of J noun
jset assign value to J noun


jinit initialize J instance
jfree free J instance

Loading the script initializes a J instance, defining global pJ as the handle. Use jfree to free it.

See examples at the end of the script itself, and

See also: might also be of historical interest.


prompts for input, optionally with a default result

form: [default] prompt prompt_text


   require 'general/misc/prompt'
   prompt 'start date: '
   '2001 5 23' prompt 'start date: '


. - the default is only available in JQt . - this will not work in a script . - in Windows console a newline is added after the prompt