stanford-oval/wikipedia huggingface dataset:
J语言
简要词汇表 > 选取

| J词汇 | APL 符号 | 词类 | 秩 | 含义 | 例子 |
| --- | --- | --- | --- | --- | --- |
| # | ≢ | 动词 | _ | （一元）计数（tally） | # 1 2 3 |
| # | ⌿ / | 动词 | 1 _ | （二元）计件复制（copy） | 1 0 2 # 1 2 3 |
| {. |  | 动词 | _ | （一元）头部（head） | {. 'foot' |
| {. | ↑ | 动词 | 1 _ | （二元）采取（take） | 3 {. 'foot' |
| }. |  | 动词 | _ | （一元）断头（behead） | }. 1 2 3 4 |
| }. | ↓ | 动词 | 1 _ | （二元）舍弃（drop） | 2 }. 1 2 3 4 |
| {: |  | 动词 | _ | （一元）尾部（tail） | {: 'foot' |
| }: |  | 动词 | _ | （一元）截短（curtail） | }: 1 2 3 4 |
:  ↑  计数最早于1989年出现在A中。在APL中，还可表达为''⍴⍴，另有二元≢不匹配。  ↑  在APL中，⌿ /复制（replicate）扩展自压缩（compress），另有二元⍀ \扩张（expand）。  ↑  J的头部（head），类似于APL的一元⊃首位（first），它取ravel次序首个元素。
简要词汇表 > 索引

| J词汇 | APL 符号 | 词类 | 秩 | 含义 | 例子 |
| --- | --- | --- | --- | --- | --- |
| i. | ⍳ | 动词 | 1 _ _ | 整数生成（integers）· 出现索引（index of） | i. 10 |
| i: |  | 动词 | 0 _ _ | 阶梯序列（steps）· 最后出现索引（index of last） | 'abcd' i: 'c' |
| I. | ⍸ | 动词 | 1 _ _ | 真值位置索引（indices）· 区间索引（interval index） | I. 0 0 1 0 1 0 |
| /: | ⍋ | 动词 | _ | （一元）升序索引（grade up） | ({~ /:) 10 ? 20 |
| /: |  | 动词 | _ _ | （二元）上升排序（sort up） | /:~ 10 ? 20 |
| \: | ⍒ | 动词 | _ | （一元）降序索引（grade down） | ({~ \:) 10 ? 20 |
| \: |  | 动词 | _ _ | （二元）下降排序（sort down） | \:~ 10 ? 20 |
| { |  | 动词 | 1 | （一元）目录汇编（catalogue） | { 0 1 ; 2 3 4 ; 5 6 |
| { | ⌷ | 动词 | 0 _ | （二元）出自（from） | 2 4 { 'abcde' |
| } | @ | 副词 | _ _ | （二元）修改（amend） | 'gw' 0 3} 'cross' |
| {:: | ⊃ | 动词 | 1 _ | （二元）获取（fetch） | 1 {:: (<1),(<<2),<<<3 |
:  ↑  J的整数生成，允许向量和负数参数；现代APL的“索引生成”，接受向量参数，产生此形状所有的坐标。
简要词汇表 > 算子

| J词汇 | APL 符号 | 词类 | 秩 | 含义 | 例子 |
| --- | --- | --- | --- | --- | --- |
| / | ∘. | 副词 | _ _ | （二元）形成表格（table） | */~ >: i. 6 |
| / | ⌿ / | 副词 | _ | （一元）插入（insert） | ([ + 2&*@])/ 1 10 100 |
| \ | ⌿ / | 副词 | _ _ | （二元）中缀（infix） | 3 <\ 'abcdefg' |
| \ | ⍀ \ | 副词 | _ | （一元）前缀（英语：）（prefix） | ]\ 'banana' |
| \. |  | 副词 | _ _ _ | 后缀（suffix）· 外缀（outfix） | _1 ]\. 1 2 3 4 |
| /. |  | 副词 | _ | （一元）斜对角（oblique） | </. i. 4 4 |
| /. | ⌸ | 副词 | _ _ | （二元）键分组（英语：）（key） | 1 0 0 1 0 </. 'AbcDe' |
| ~ | ⍨ | 副词 | _ lu ru | 返身（reflex）· 被动（passive） | +~ 1 2 3 |
| " | ⍤ | 连词 |  | 秩（rank） | +/"1 i. 2 3 4 |
| @: | ⍤ | 连词 | _ _ _ | 在于（at） |  |
| @ |  | 连词 | mv lv rv | 顶上（atop） |  |
| & |  | 连词 | mv mv mv | 合成（compose） |  |
| & | ∘ | 连词 | _ 0 _ | 粘上（bond） |  |
| &: | ⍥ | 连词 | _ _ _ | 并列（appose） |  |
| &. |  | 连词 | mv mv mv | 对偶（dual） |  |
| &.: | ⍢ | 连词 | _ _ _ | 底下（under） |  |
| @. |  | 连词 | mv lv rv | 议程（agenda） |  |
| ` |  | 连词 |  | 连结动名词（tie or gerund） |  |
| `: |  | 连词 | _ _ _ | 唤起动名词 （evoke gerund） |  |
| ^: | ⍣ | 连词 | _ _ _ | 动词幂（power of verb） | +: ^:(6&<)"0 ] 5 12 |
| !. | ⍠ | 连词 | mu lu ru | 调整/定制（fit/customize） | 2 |.!._ i. 6 |
| !: | ) | 连词 | 0 0 0 | 外界（foreign）/系统函数 | 6!:0 '' |
:  ↑  在APL中，表格算子∘.叫做外积（英語：）。  ↑  在APL中，中缀称为“窗口归约”（windowed reduce）或“逐n项归约”（n-wise reduce）。  ↑  这些连词对于隐式编程有重大意义，在后面的定语章节中专门论述。
简要词汇表 > 杂类

| J词汇 | APL 符号 | 词类 | 秩 | 含义 | 例子 |
| --- | --- | --- | --- | --- | --- |
| =. | ← | 系词 |  | 是（is），局部作用域（local） | loc=. 1 2 |
| =: | ← | 系词 |  | 是（is），全局作用域（global） | 'a b' =: 3 ; 4 |
| NB. | ⍝ | 系词 |  | 注释（comment） | NB. for comments |
| '字符串' | '字符串' | 名词 |  | 字符串（character string） | 'Hello, World!' |
| _ | ¯ ∞ | 名词 |  | 负号（negative sign）/ 无穷（infinity） | _3 = -3 |
| 0$0 | ⍬ |  |  | 空数值向量（empty numeric vector） | $ 0$0 |
| a: |  | 名词 |  | 么点（英语：）即盒装空值（boxed empty） | a: -: <0$0 |
| [ | ⊣ | 动词 | _ _ _ | 相同（same）· 左参数（left） | p=: 3 [ q=: 5 |
| ] | ⊢ | 动词 | _ _ _ | 相同（same）· 右参数（right） | i."0 ] 3 4 5 |
| [: |  | 动词 |  | 遮帽（cap） | ({~ [: ? #) 3 1 4 |
| ". | ⍎ | 动词 | 1 _ _ | 执行（do）· 数值（numbers） | 9999 ". '56 NULL' |
| ": | ⍕ | 动词 | _ 1 _ | 缺省格式（default format）· 格式（format） | 10j2 ": 6 |
| {{ }} | { } | 控制 |  | 直接定义（direct definition） | dist=: {{%:+/*:x-y}} |
| : | ∇ | 连词 |  | 定义（definition） | add=: 0&$: : {{x+y}} |
| $: | ∇ | 动词 | _ _ _ | 自引用（self-reference） | fact=: 1:`(* $:@<:)@.* |
定语

J语言的能力，很大程度上来自它的“定语”（modifier：修饰词），这个范畴包括“副词”和“连词”：这些符号接受名词和动词作为运算元（operand），并以指定方式应用这些运算元。定语都可以应用于任何动词，包括用户写的动词，用户可以写自己的定语。
J语言的二元动词有右结合性，或称为尽量长右作用域，即它有尽可能多的右参数。定语即算子有左结合性，或称为尽量长左作用域，即它有尽可能多的左运算元。如果表达式中存在定语即算子，首先应用这些定语，然后应用其生成的动词。
定语 > 副词

一元副词/“插入”（insert），副词\“前缀·中缀”（prefix·infix），副词\.“后缀·外缀”（suffix·outfix），和连词;.“剪切”（cut），指定参数的诸个规则或不规则子集，并在其上执行运算。在J语言实现中，前缀和（英语：）+/\、极小值<./\和极大值>./\运算，是典型的会对其进行速度优化的特殊组合。
副词~“反身·被动”（reflex·passive），其一元形式f~ y↔y f y，将提供给动词的右参数重复放置在左参数位置上；二元形式x f~ y↔y f x，将提供给动词的左右两个参数对换位置。
定语 > 秩

名词的秩（rank）是排布其原子所依据的轴的数目，即它的形状中项目的数目。动词的秩是它能够在其上直接运算的右（和左）名词参数的最高秩，典型的表示为三个原子的一个列表：一元秩 二元左秩 二元右秩。对副词和连词标示的秩，是所形成的动词的秩。
秩在特定动词和特定名词的上下文下，将名词的诸维，划分成前缀诸维的序列，称为框架（frame）；和后缀诸维的序列，称为单元（cell）。秩采用连词"“秩”来操纵，对应于APL符号⍤，它有三种形式：u"n“指定秩”（assign），m"n“常量动词”（constant），u"v和m"v“复制秩”（copy），这里的u、v表示动词运算元，而m、n表示名词运算元。正数动词秩，指示单元诸维的数目，负数动词秩，指示框架诸维的数目，_指示整体。
二元动词的左右参数的框架经常是匹配的，就是说二者有相同的形状，从而保证了它们有相同数目的单元。如果左右参数的框架不匹配，有三种可以运算的情况：
标量一致，如果指定了两参数中某一侧的框架为空，即秩为_，这一个整体单元被应用于另一侧参数的所有单元。
前缀一致，两参数中有一侧的短框架是另一侧长框架的前缀，短框架的每个单元，被应用于对应的长框架去掉前缀余下诸维形成的单元阵列的所有单元。
后缀一致，两参数中有一侧的短框架是另一侧长框架的后缀，这时需要以两侧加上相同正数增量的方式指定秩，使原短框架侧的框架为空，原短框架的诸维形成的这一个单元阵列，被应用于原长框架去掉后缀余下诸维形成阵列的每个单元阵列。
定语 > 复合连词

连词@:“在于”（at）、@“顶上”（atop）、&:“并列”（appose）、&“合成”（compose），是四种复合（composition）。J语言支持叫作“钩子”（hook）和“叉子”（fork）的隐形连词，二种隐形连词和四种复合连词，规定了如何将参数或将所饰动词应用于参数的结果，提供给所饰动词来进行应用的规则。下表列出它们的定义：
| 连词 | APL 符号 | 一元 | 二元 | 秩 |
| --- | --- | --- | --- | --- |
| 钩子 |  | (u v) y ↔ y u (v y) | x (u v) y ↔ x u (v y) | _ _ _ |
| 叉子 |  | (f g h) y ↔ (f y) g (h y) | x (f g h) y ↔ (x f y) g (x h y) | _ _ _ |
| @: | ⍤ | (u @: v) y ↔ u (v y) | x (u @: v) y ↔ u (x v y) | _ _ _ |
| @ |  | (u @ v) y ↔ (u @: v)"v y | x (u @ v) y ↔ x (u @: v)"v y | mv lv rv |
| &: | ⍥ | 同于@:而应弃用 | x (u &: v) y ↔ (v x) u (v y) | _ _ _ |
| & |  | 同于@而应弃用 | x (u & v) y ↔ x (u &: v)"mv y | mv mv mv |
在上面表格中，mv=: 0{v b.0，lv=: 1{v b.0，rv=: 2{v b.0，这里的副词b.0给出动词v的三个秩。在应用四种复合连词形成新动词的表达式中，@:和&:，要对第一步运算的中间结果，按所在子表达式的秩或整个表达式的秩_进行汇集（assembly），并在有需要的情况下进行框架填充，然后在这个汇集成的框架内进行第二步运算；而@和&，直接在第一步运算的框架内，对中间结果进行第二步运算；在整个表达式求值结束时，最终结果在有需要的情况下要进行整体填充。
在x (u @ v) y中，一元u直接在二元v所划分的框架内进行自己的运算。在x (u @: v)"v y中，@:将二元v的运算结果，汇集成"v所指定的框架。在x (u & v) y，二元u直接在一元v所划分的两个框架内进行自己的运算。在x (u &: v)"mv y中，&:将一元v的两个运算结果，汇集成"mv所指定的框架。
下面例子展示四种复合的中间结果的单元差异：
] a =: >:i. 2 3
1 2 3
4 5 6
   ] b =: 0.1*>:i. 2
0.1 0.2
   a (< @: +) b
┌───────────┐
│1.1 2.1 3.1│
│4.2 5.2 6.2│
└───────────┘
   a (< @ +) b
┌───┬───┬───┐
│1.1│2.1│3.1│
├───┼───┼───┤
│4.2│5.2│6.2│
└───┴───┴───┘
   a (; &: |) b
┌─────┬───────┐
│1 2 3│0.1 0.2│
│4 5 6│       │
└─────┴───────┘
   a (; & |) b  NB. 这里的框架仍是2 3
┌─┬───┐
│1│0.1│
├─┼───┤
│2│0.1│
├─┼───┤
│3│0.1│
└─┴───┘

┌─┬───┐
│4│0.2│
├─┼───┤
│5│0.2│
├─┼───┤
│6│0.2│
└─┴───┘
当连词&的一个运算元是名词的时候，表示“粘上”（bond），它通过向二元动词固定提供其一个参数的值而产生一个动词：
| 连词 | APL 符号 | 秩 |
| --- | --- | --- |
| & | ∘ | _ 0 _ |
&派生的动词经常作为一元动词使用，即m&v y或u&n y；如果作为二元动词使用，即x m&v y或x u&n y，左参数表示应用这个派生动词于右参数的次数。需要确保通过&定义的一元动词，不出现在能够取用左右两个的参数的上下文中；如此定义的二元动词，也不应该出现在只能取用一个右参数的上下文中。需要注意m&v、v/和v\等的左参数的作用域，有时遇到其左侧的复合连词会产生并非预期的效果，经常需要将表达式整体加以圆括号包围。
J语言还提供连词&.:“底下”（under）和&.“对偶”（dual）。下面定义中的动词幂^:_1表示逆运算：
| 连词 | APL 符号 | 定义 | 秩 |
| --- | --- | --- | --- |
| &.: | ⍢ | u &.: v ↔ v^:_1 @: u &: v | _ _ _ |
| &. |  | u &. v ↔ (u &.: v)"mv | mv mv mv |
@、&和&.合称为“紧密复合”（close composition）。现代APL中另有¨“每个”（each），f¨相当于J语言中的f &.>。例如：
1 2 + &.:> 0.1 0.2
┌───────┐
│1.1 2.2│
└───────┘
   1 2 + &.> 0.1 0.2
┌───┬───┐
│1.1│2.2│
└───┴───┘
在J语言中，孤立的动词序列叫做“列车”（train）， e f g h意味着(e (f g h))，d e f g h意味着(d e (f g h))；以此类推，动词列车的一般模式(a b c ...)，依赖于动词的数目，在偶数时形式为(a (b c ...))，最外层是个钩子；而在奇数时形式为(a b (c ...))，最外层是个叉子；二者的内部都是可能有多层的嵌套的叉子。
叉子、@:再加上[和]，可以将很多常用复合写为列车。在惯用法([: f g)中，并不实际执行的隐式动词[:“遮帽”（cap），屏蔽了叉子的左分支，形成了等价于f @: g的特殊化叉子。
与现代APL如Dyalog等对照，复合连词@:对应于同秩连词共享APL符号⍤的“顶上”（atop），而&:对应于⍥“上方”（over），共享&符号的“粘上”，对应于APL中的“绑上”（bind），APL的“绑上”和“边上”（beside）共享符号∘，“边上”的一元形式同于⍤，而二元形式同于钩子。在《APL字典》中，@对应其⍥，而&列入秩连词⍤之内，钩子对应于符号⍩“枝条”（withe），&.对应于符号¨。
定语 > 复合连词 > 用例

下面的简单例子是计算欧几里得范数，和生成数位与维度坐标一致的整数：
]d=: (1 1),(1 1 1),:(3 4)
1 1 0
1 1 1
3 4 0
   norm=: %: @ (+/) @: *:"1    NB. 它可加圆括号为((%: @ (+/)) @: *:)"1
   norm d
1.41421 1.73205 5
   coor=: 10&#. @ > @ { @: (< @: >: @ i."0)
   coor 2 3 4
111 112 113 114
121 122 123 124
131 132 133 134

211 212 213 214
221 222 223 224
231 232 233 234
在coor中采用的圆括号包围，使得@:处在整个表达式的最外层，从而形成了两步骤运算；右侧的第一步是圆括号包围的子表达式，它的完全加圆括号（fully-parenthesized）形式为：(((< @: >:) @ i.)"0)；左侧的第二步是{与复合到其上诸运算构成的子表达式，它的完全加圆括号形式为：(((10 & #.) @ >) @ {)。一元动词{“目录汇编”（catalogue），应用在盒装列表的列表之上，是接受可变数目的变长参数的典型的动词。
下面通过对圆括号包围的子表达式加以变化，辨析秩连词和复合连词的特性。这里的动词]，划分开了给连词或副词的名词运算元，和给所生成的动词的名词参数：
]a=: < @: >: @ i."0 ] 2 3 4    NB. 运算式可加圆括号为((< @: >:) @ i.)"0
┌───┬─────┬───────┐
│1 2│1 2 3│1 2 3 4│
└───┴─────┴───────┘
   a -: < @: (>: @ i.)"0 ] 2 3 4  NB. 运算式可加圆括号为(< @: (>: @ i.))"0
1
   a -: < @ (>: @ i."0) 2 3 4     NB. 运算式可加圆括号为< @ ((>: @ i.)"0)
1
   < @ >: @ i."0 ] 2 3 4          NB. 运算式可加圆括号为((< @ >:) @ i.)"0
┌─┬─┬─┬─┐
│1│2│ │ │
├─┼─┼─┼─┤
│1│2│3│ │
├─┼─┼─┼─┤
│1│2│3│4│
└─┴─┴─┴─┘
   < @: (>: @ i."0) 2 3 4         NB. 运算式可加圆括号为< @: ((>: @ i.)"0)
┌───────┐
│1 2 0 0│
│1 2 3 0│
│1 2 3 4│
└───────┘
下面的例子展示并联电阻电路计算：





1

R


t
o
t
a
l





=


1

R

1




+


1

R

2




+
⋯
+


1

R

n






{\textstyle {\frac {1}{R_{\mathrm {total} }}}={\frac {1}{R_{1}}}+{\frac {1}{R_{2}}}+\cdots +{\frac {1}{R_{n}}}}

，它可以如下这样表达：
Rtotal=: +/ &.: %
   Rtotal 10 5 15
2.72727
定语 > 动词幂

连词^:动词幂”（power of verb），有两种形式：
^:n，是运算元为名词的“固定幂”。
^:v，是运算元为动词的“动态幂”。
对于固定幂u ^:n，如果x缺席，u ^:n y在以y为运算对象的迭代中，将动词u应用n次；如果x存在，x u ^:n y在以y为运算对象的迭代中，将动词x&u应用n次。如果n是阵列，则按每个原子项目都执行一次动词幂，结果的框架为这个阵列的形状；如果n是取值为0或1的变量，则形成布尔值条件执行；如果n是_1，则进行u的逆运算；如果n是_，则意味着“收敛”（converge），即反复应用u直到结果不再变化。例如：
(1+*&3) ^:0 1 ] 1 2 3 4
1 2  3  4
4 7 10 13
   ' ' , ^:4 'abc'
    abc
   (1+*&3) ^:_1 ] 4 7 10 13
1 2 3 4
   (-:@(]+%)) ^:_ &1 ] 0.25 3 25  NB. 以巴比伦方法即一种牛顿法特例来计算平方根
0.5 1.73205 5
对于动态幂u ^:v，如果x缺席，u ^:v y在以y为运算对象的迭代中，将动词u应用v y次；如果x存在，x u ^:v y在以y为运算对象的迭代中，将动词x&u应用x v y次。动词幂可以形成动态条件执行，这里的动词v必须总是产生布尔值结果，应用动词u当且仅当v返回1。进而u ^:v ^:_ y可以形成while循环构造，只要v返回1，就反复的执行u，直到v返回0，或者u将它的参数无变化的返回。例如：
-&2 ^:(>&4) "0 ] 1 3 6 12                    NB. 对大于阈值4的列表项目减去2
1 3 4 10
   4 (0.25&*@[+(1-0.25)&*@]) ^:< "0 ] 1 3 6 12  NB. 对大于阈值4的列表项目在其超出部份上扣除25%
1 3 5.5 10
   +&3 ^:(<&100) ^:_ "0 ] 2 3 100               NB. 只要列表项目小于100就对它加上3
101 102 100
定语 > 动词幂 > 用例

下面的例子用来辨析秩指定与框架划分及汇集的性质，其中涉及的直接定义等内容可见于后面的定义章节：
itemize=: ,: : {{,: ^:x ] y}}"(0 _)  NB. 定义具有一元和二元两种形式的项目化扩秩运算
   <@itemize~ i.3
┌─────┬─────┬─────┐
│0 1 2│0 1 2│0 1 2│
└─────┴─────┴─────┘
   $&.> <@itemize~ i.3
┌─┬───┬─────┐
│3│1 3│1 1 3│
└─┴───┴─────┘
   $ <"2@itemize~ i.3
3 1
   $&.> <"2@itemize~ i.3
┌───┐
│3  │
├───┤
│1 3│
├───┤
│1 3│
└───┘
   $ <"_1@itemize~ i.3
3 3
   $&.> <"_1@itemize~ i.3
┌───┬─┬─┐
│   │ │ │
├───┼─┼─┤
│3  │0│0│
├───┼─┼─┤
│1 3│0│0│
└───┴─┴─┘
   #&.>@<"_1@itemize~ i.3
┌─┬─┬─┐
│1│1│1│
├─┼─┼─┤
│3│ │ │
├─┼─┼─┤
│1│ │ │
└─┴─┴─┘
   $ 1

   $ 0$0
0
   # 0$0
0
   $ <"1@itemize~ i.3
3 1 1
   $ <"_2@itemize~ i.3
3 1 3
   $ <"0@itemize~ i.3
3 1 1 3
   $ <"_3@itemize~ i.3
3 1 1 3
定语 > 动名词

在J语言中，动名词（gerund）是叫做“原子表示”的特殊盒子的一个列表，这种盒子可以像任何其他盒子一样使用，并可以最终转变回到要执行的动词。关于动名词的运算有：
连词`“连结动名词”（tie or gerund），建立动名词。
连词`: “唤起动名词”（evoke gerund），在加以运算元之后成为：
`:6，将动名词转变成动词列车；
`:0，将转变回来的这些动词分别单独应用，并将它们的结果收集入一个列表。
连词@.“议程”（agenda），m @. n从动名词m中，选择出第n个原子表示，将它转变回到动词并执行它。
下面是动名词简单示例和考拉兹猜想示例：
grd =: * ` (+&2)  NB. 建立一个动名词
   grd               NB. 显示原子表示，这里的符号'0'标识名词
┌─┬─────────────┐
│*│┌─┬─────────┐│
│ ││&│┌─┬─────┐││
│ ││ ││+│┌─┬─┐│││
│ ││ ││ ││0│2││││
│ ││ ││ │└─┴─┘│││
│ ││ │└─┴─────┘││
│ │└─┴─────────┘│
└─┴─────────────┘
   {. grd            NB. 动名词可以像普通盒子一样操纵
┌─┐
│*│
└─┘
   grd `:6 i. 4      NB. 将动名词转换成动词列车来执行
0 3 8 15
   grd `:0 i. 4      NB. 将动名词转换成并行执行的动词
0 1 1 1
2 3 4 5
   Collatz=: -: ` (1+*&3) @. (2&|)  NB. 考拉兹猜想的算式
   Collatz "0 ] 1 2 3 4 5 6 7
4 1 10 2 16 3 22
   >./@(Collatz^:(>&1)^:_"0@>:@?@$&1e6) 1000  NB. 取1000个在1e6内的随机数测试考拉兹猜想
1
定义

J语言支持用户进行显式定义，和{{……}}形式的直接定义（英语：）。下面以五种复合作为显式定义的例子：
at=: conjunction define 
    u (v y)
   :
    u (x v y)
   )
   atop=: conjunction def '(u at v)"v'
   beside=: conjunction define 
    u (v y)
   :
    x u (v y)
   )
   appose=: conjunction define
    u (v y)
   :
    (v x) u (v y)
   )
   compose=: conjunction def '(u appose v)"(0{v b.0)'
下面以矩阵乘法作为直接定义的例子，并顺带演示秩连词的用法：
a=: ? @ $&1000 @: >: 4?10
   b=: |: a
   p=: a (+/ . *) b
   matmul=: {{x u@:v"(1 _) y}}
   (a (+/ matmul *) b) -: p
1
   inner=: {{x (u@:v"1)"(1 _) y}}
   (a (+/ inner * 0&|:) b) -: p
1
   outer=: {{x u@(v/"_1~ |:)~"(2 _) y}}
   (a (+/ outer *) b) -: p
1
   revmul=: {{x (i.<:#$y)&|:@(u@:v"(_ 1)~ |:)~"(2 _) y}}
   (a (+/ revmul * 0&|:) b) -: p
1
APL传统上的将内积Pf.gQ解释为f/PgQ，J语言的矩阵乘法要求写为Pf/ .gQ，不隐含的为左运算元f附加一元/。转置也是有较大开销（英语：）的运算，不同的矩阵乘法算法（英语：）有不同的参照局部性。
matmul通过"(1 _)将u@:v的右参数从向量扩展为一般阵列，它用于右参数为行主序（英语：）阵列的情况。在向量与向量列表二者诸项之间逐对的进行乘积累加运算，是BLAS的标准算法。
inner采用了两向量之间的点积运算u@:v"1，它适宜直接用于右参数为列主序（英语：）阵列的情况。在右参数为行主序阵列之时，需要如例子代码这样，对右参数阵列进行二元转置0&|:，这里的0指示将第一轴安排至最后位置而其他轴保持原序前移。这种基于点积的实现，通常需要进一步加以循环镶嵌（英语：）。
outer可以看作matmul的变体，它首先对左参数阵列进行转置，然后进行多组的向量与一般阵列之间二元的张量积运算v/"_1，最后在各组结果的列表上进行u计算，每组运算之后参与其中的左右两阵列的元素不会被其他组的运算再次访问。
revmul同inner一样适宜直接用于右参数为列主序阵列的情况，但采用了同matmul类似的计算方法，它在乘法之前对左参数阵列和在乘法之后对结果要做转置，matmul与revmul的关系如同 \,(\mathrm {AB} )^{\mathsf {T}}=\mathrm {B} ^{\mathsf {T}}\mathrm {A} ^{\mathsf {T}}\,。matmul一次性访问左参数阵列，反复多次访问右参数阵列；revmul一次性访问右参数阵列，反复多次访问左参数阵列。
在隐式定义中，递归定义可以不通过名字引用自身，转而使用动词$:“自引用”。例如递归的计算斐波那契数列：
fibonacci=: 1: ` ($:@-&2 + $:@<:) @. (>&2) "0 : [:
   fibonacci >:i.9
1 1 2 3 5 8 13 21 34
_9:到9:是常量动词。动词[:“遮帽”，用在连词u : v“一元与二元定义”所应用的动词位置上，即充任了一元动词u或二元动词v，可分别在如下两种情况下报错：定义的是二元动词，却不适当的被用作一元动词；或定义的是一元动词，却不适当被用作二元动词。
在显式定义和直接定义中，提供了类似其他过程语言的控制结构。这里列出的是每个范畴内的代表性控制字：
| 范畴 | 控制结构 |
| --- | --- |
断言触发: assert.
返结果退出: return.
跳转到标号: goto_lbl. label_lbl.
条件执行: if. T do. B else. B1 end.
情况执行: select. T case. T0 do. B0 end.
条件循环: while. T do. B end. 
逐项执行: for_ijk. A do. B end.
终止循环: break.
终止本次迭代: continue.
尝试执行捕获异常: try. B catch. B1 end.
抛出异常: throw.
索引

J语言的索引机制采用二元{“来自”（from）动词来完成，它的秩为0 _，它有两种形式，分别为左参数为索引阵列的主轴索引，和左参数为二层或一层盒装结构的逐轴索引，二者分别对应APL中，方括号内为单个轴的主轴索引选取，和方括号内为;分隔的多个轴的逐轴索引选取。
索引 > 主轴索引

索引阵列的每个项目指定对主轴的项目单元的一个选取，将它们的结果再汇合为一个阵列。负值索引表示从末尾往前记数。在APL中，这种形式的索引被称为“来自”（from），也叫做“选取”（select）或幽默地称为“明智”（sane）索引，最早出现在SAX（SHARP APL for UNIX）对其@“来自”索引的扩展中，部份现代APL，将它表示为符号⊇。例如：
i. 2 3
0 1 2
3 4 5
   1 0 { i. 2 3
3 4 5
0 1 2
   1 0 {"1 i. 2 3
1 0
4 3
   (i. 2 3) { 'abcdefg'
abc
def
   _1 { 'abcdefg'
g
索引 > 逐轴索引

逐轴选取可以形成子阵列，在现代APL中，它被表示为⌷，故而也被称为“扁方块”（squad：squish quad）索引（indexing）或就叫做“索引”（index）函数。装在二层盒装结构中的，是对应诸轴的一层盒装子结构的列表，其中每个一层盒装子结构内都是数值列表，它对应在此轴内一个或多个项目选择。默认全选使用名词a:“么点”（ace）指示，它是盒装空列表<0$0。在尾部的连续多个默认全选不需要写出。例如：
i. 3 4
0 1  2  3
4 5  6  7
8 9 10 11
   (<<1 2) { i. 3 4
4 5  6  7
8 9 10 11
   (<1 2;0 2 3) { i. 3 4
4  6  7
8 10 11
   (<a:;0 2 3) { i. 3 4
0  2  3
4  6  7
8 10 11
   (<a:;0 2 3)
┌──────────┐
│┌──┬─────┐│
││┌┐│0 2 3││
│││││     ││
││└┘│     ││
│└──┴─────┘│
└──────────┘
它还支持一层盒装结构，装在其中的是数值列表，它的元素指示每轴选取一个项目，如果单选了所有轴，则指定一个原子项目。一层盒装结构中的这个数值列表，等价于二层盒装结构中一层盒装的单一数值的列表。两种索引形式可以结合使用，即可以将盒装结构的阵列作为给{的左参数，它按这个阵列的形状汇合多个逐轴选取的结果。例如：
(<1 2) { i. 3 4
6
   ((<0 0),(<2 2),(<1 1)) { i. 3 4
0 10 5
   (<0 0),(<2 2),(<1 1)
┌───┬───┬───┐
│0 0│2 2│1 1│
└───┴───┴───┘
例如(<<1 2),(<a:;0 2 3)这样的选取是合法的，将形状不一致的选取结果汇合在一起，会导致结果值填充。
索引 > 重排轴

重排轴也叫做二元转置。APL的二元转置对轴次序的指定，类似于组合数学中置换的一行形式的柯西表示法，它被称为“可能是APL编程者最后掌握的原始运算之一”。J语言的二元转置对轴次序的指定，不涉及将多个轴映射到结果中的一个轴的情况，使用了普通的索引形式的置换向量。在置换向量的元素个数小于阵列轴的数目之时，J语言在置换结果中将其指定的诸轴安排在尾部，而其他轴保持原来相对次序前移。
针对向量的索引运算，是不加盒装的主轴索引。要访问一般阵列的特定原子项目，其选取向量需要一层盒装，从而对其进行逐轴索引。置换向量p所对应的逆向置换向量是/:p，对于两个置换向量p和q，则有/:p{q ↔ (/:q){/:p。
二元转置与索引机制有密切关联，它有两个重要性质：
两次连续的二元转置，可以变换成等价形式：<nowiki>p|:q|:A</nowiki> ↔ <nowiki>(p{q)|:A</nowiki>，即先将后者置换向量p对前者置换向量q进行置换，然后用结果的置换向量做一次二元转置。
对二元转置后的阵列，进行原子项目的选取，可以变换成等价形式：(<k){p<nowiki>|</nowiki>:A ↔ (<(/:p){k){A，即先用置换向量p的逆置换向量/:p，对选取向量k进行置换，然后用结果的选取向量来选取未转置阵列。
下面是演示例子代码：
a=: ? @ $&1000 @: >: 4?10
   n=: # @ $ a
   p=: ?~ n
   q=: ?~ n
   (/:/:p) -: p
1
   ((/:p) { p) -: i. n   
1
   (/: p{q) -: (/:q) { /:p
1
   (p |: q|:a) -: (p{q) |: a
1
   k=: ? $ p |: a
   ((<k) { p|:a) -: (<(/:p){k) { a
1
示例 > 帕斯卡三角

下面例子形成帕斯卡三角的二项式系数的直接定义，并顺带展示基本的矩阵与盒装运算：
pascal=: {{(0&, + ,&0) ^: y 1}}"0
   pascal @ i. ] 5
1 0 0 0 0
1 1 0 0 0
1 2 1 0 0
1 3 3 1 0
1 4 6 4 1
   ({. (+//. @: pascal @ i.)) 9      NB. 斐波那契数列
1 1 2 3 5 8 13 21 34
   ((+/ . *) |:) @: pascal @ i. ] 5  NB. 帕斯卡矩阵
1 1  1  1  1
1 2  3  4  5
1 3  6 10 15
1 4 10 20 35
1 5 15 35 70
   <"0 @ pascal @ i. ] 5
┌─┬─┬─┬─┬─┐
│1│ │ │ │ │
├─┼─┼─┼─┼─┤
│1│1│ │ │ │
├─┼─┼─┼─┼─┤
│1│2│1│ │ │
├─┼─┼─┼─┼─┤
│1│3│3│1│ │
├─┼─┼─┼─┼─┤
│1│4│6│4│1│
└─┴─┴─┴─┴─┘
   ]t=: < @ pascal @ i. ] 5
┌─┬───┬─────┬───────┬─────────┐
│1│1 1│1 2 1│1 3 3 1│1 4 6 4 1│
└─┴───┴─────┴───────┴─────────┘
   (<@#&a:"0@|.@i.@# ,&> }:@,@:(,.&a:@<"0)&.>) t
┌─┬─┬─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │1│ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │ │1│ │1│ │ │ │
├─┼─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │1│ │2│ │1│ │ │
├─┼─┼─┼─┼─┼─┼─┼─┼─┤
│ │1│ │3│ │3│ │1│ │
├─┼─┼─┼─┼─┼─┼─┼─┼─┤
│1│ │4│ │6│ │4│ │1│
└─┴─┴─┴─┴─┴─┴─┴─┴─┘
二项式系数也可以写成隐式定义形式：
pascal=: ((0&, + ,&0)@] ^:[ 1:)"0 : [:
示例 > 简易图表

下面是基于二元副词/“形成表格”（table），制作条形图和散点图的简易图表例子:
barChartH=: {&('.',u:16b2584) @ (>/ i.@(>./)) : [:
   barChartH 3 1 4 1 5 9 2 6 5
▄▄▄......
▄........
▄▄▄▄.....
▄........
▄▄▄▄▄....
▄▄▄▄▄▄▄▄▄
▄▄.......
▄▄▄▄▄▄...
▄▄▄▄▄....
   barChartV=: {&('.',u:16b258c) @ (</~ |.@i.@(>./)) : [:
   barChartV 3 1 4 1 5 9 2 6 5
.....▌...
.....▌...
.....▌...
.....▌.▌.
....▌▌.▌▌
..▌.▌▌.▌▌
▌.▌.▌▌.▌▌
▌.▌.▌▌▌▌▌
▌▌▌▌▌▌▌▌▌
   scatterChart=: {&('.',u:16b2588) @ (=/~ >:@|.@i.@(>./)) : [:
   scatterChart 3 1 4 1 5 9 2 6 5
.....█...
.........
.........
.......█.
....█...█
..█......
█........
......█..
.█.█.....
这里用到的Unicode方块元素字符也出现在IBM PC代码页437之中。
这里的scatterChart可以使用二元副词}“修改”（amend）来实现：
scatterChart=: {&('.',u:16b2588) @ ((>./ , #) {{
    1 y } $&0 x}} (#~ <&9@{."1)@((-~ >./) ,. i.@#)) : [:
示例 > 对角线选取

APL的二元转置，在多个轴映射到结果中的一个轴的情况下，将其依次安排到前导位置上并进行对角线选取。下面基于一元动词I.“真值位置索引”，定义进行对角线选取的动词diag，它的左参数是布尔值列表，其中的真值1指示与其位置对应的轴，要依次安排在前导位置上并进行对角线选取，其他的假值0所对应的轴相对位置不变。
diag=: {{
    s=. (I. , I.@:-.) @ ({.~ #@$) 
    t=. <"1 @ (i.@(<./)@({. $) */ #&1@[)
    ({~ (+/x)&t) @ (|:~ x&s) y}}
这里局部定义了s，它的左右参数同于给diag的参数，它生成二元转置需要的置换向量，这是由要安排到前导位置上的那些轴的位置索引，和余下其他轴的位置索引串接而成。这里的{.~ #@$以右参数的诸轴数目选取左参数，用来在左参数的真值和假值的总数小于右参数的诸轴数目之时，对左参数填充上假值。
接着局部定义了t，它的左参数是给diag的布尔值列表中真值1的个数，右参数是要对其指定数目的前导轴进行对角线选取的阵列，它生成对角线选取所需要的一层盒装选取列表。这里的(<./)@({. $)选取出要进行对角线选取的前导诸轴的最小长度，用i.形成这个长度的整数数列，再用#&1@[形成其长度为左参数的全为1的列表，通过*/在二者之上形成表格矩阵。
最后的表达式先进行指定的二元转置，再对其结果进行相应的对角线选取。下面是简单用例：
>:i. 3 5
 1  2  3  4  5
 6  7  8  9 10
11 12 13 14 15
   1 1 diag >:i. 3 5
1 7 13
   i. 2 3 2
 0  1
 2  3
 4  5

 6  7
 8  9
10 11
   1 1 diag i. 2 3 2
0 1
8 9
   0 2 1 |: i. 2 3 2
0 2  4
1 3  5

6 8 10
7 9 11
   1 0 1 diag i. 2 3 2
0 2  4
7 9 11
示例 > 快速排序

J语言提供的排序机制基于了稳定排序算法，下面的例子代码是快速排序的直接定义：
cmp=: * @ -
   quicksort=: {{
    if. 1 >: #y do. y return. end.
    s=. y u y {~?# y
    (u quicksort (s<0)#y),((s=0)#y),(u quicksort (s>0)#y)}}
这里定义一个动词cmp，它通过逐个做两个数的差并取其符号，得到取值为_1、0或1的平衡三进制值。cmp将作为左运算元传递给副词quicksort。
在quicksort的定义中，向局部变量s赋值的表达式，第一步随机选择支点（pivot）运算，首先计算?#y，生成在数据总个数范围内的随机数，接着在其上计算{~，选择出在随机数指定的位置上的支点值；它的第二步运算，将运算元u，应用到其左参数的数据列表，和右参数的支点值二者之上。
随后是串接分治运算结果，首先将平衡三进制值列表，分别与0做逐项的三分法比较，得到三个布尔值列表；然后以这种列表中的0和1作为件数，复制出数据列表的符合这个条件一个新的子列表，其中两个作为参数传递给递归调用进行排序。
下面的快速排序实现，展示了隐式编程，即将函数复合在一起，而不显式的引用任何变量，不提及要应用于其上的形式参数。这里将前面代码中向局部变量s赋值时所求值的表达式改为隐式定义，进而以作为钩子的第一步运算的方式，代入引用这个变量的表达式之中，并且采用钩子的参数复制机制消隐了形式参数y：
cmp=: * @ -
   quicksort=: {{((($:@#~ <&0),(#~ =&0),($:@#~ >&0)) (u ({~ ?@#))) ^: (1<#) y}}
   cmp quicksort 2 0 4 7 15 9 8 0 4 9 18 8 1 18 
0 0 1 2 4 4 7 8 8 9 9 15 18 18
提供给连词^:的左侧运算元，外层是个一元钩子，它将提供给它的单一右数据参数，重复放置在它的左数据参数位置上。这个外层一元钩子的第一步运算，是生成平衡三进制值列表的嵌套的二层一元钩子(u ({~ ?@#))；而外层一元钩子的第二步运算，将生成的三个子列表串接起来。生成三个子列表的表达式，以数据列表是作为左参数，以平衡三进制值列表作为右参数；这里的三个二元钩子首先生成布尔值列表，接着进行对换了左右参数位置的二元复制运算，最后它们中有两个通过自引用$:进行了递归调用。
这个定义中的$:是在这个副词的私有语境内调用的动词，所以不像前面直接定义那样需要加上运算元u以副词形式来调用。这里没有对字符串长度小于等于1的情况进行处理，这是因为迭代运算在条件不满足时返回初始值，也就是返回这个字符串本身。将cmp的表达式，代入定义中的左运算元u，就能定义出动词，同时也不再需要外在的采用直接定义的形式。
将一元钩子替代为左分支为]的叉子，形成的动词列车更具可读性：
quicksort=: {{(] (($:@#~ <&0),(#~ =&0),($:@#~ >&0)) ] u ] {~ [:?#) ^: (1<#) y}}
下面的例子定义基于一元/:进行字符串比较的cmp：
cmp=: -/ @ (-.@-: * /:@;)
   'alpha' cmp 'beta'
_1
   'beta' cmp 'alpha'
1
   'beta' cmp 'beta'
0
   t=: ' the heart has its reasons that the reason does not know'
   ]words=: <;._1 t
┌───┬─────┬───┬───┬───────┬────┬───┬──────┬────┬───┬────┐
│the│heart│has│its│reasons│that│the│reason│does│not│know│
└───┴─────┴───┴───┴───────┴────┴───┴──────┴────┴───┴────┘
   cmp&> quicksort words
┌────┬───┬─────┬───┬────┬───┬──────┬───────┬────┬───┬───┐
│does│has│heart│its│know│not│reason│reasons│that│the│the│
└────┴───┴─────┴───┴────┴───┴──────┴───────┴────┴───┴───┘
在这个cmp定义中，/:@;先将两个字符串参数进行盒装串接，然后一元/:给出二者的升序索引，二者之间为升序或相同时为0 1，而二者为降序时为1 0；至此是升序还是相同仍需区分，-.@-:判断两参数是否为“不相同”，不相同时为1，而相同时为0。这里的副词;._1“自有区间”，使用字符串的第一个字符作为分隔符，对字符串进行划分并去除分隔符，然后应用所修饰的动词于这些子字符串之上。
示例 > 全排列

下面的例子给出n个项目的所有置换的有次序的矩阵。首先定义名词p3，它是置换长度为3的全排列矩阵：
]p3=: (i.@! A. i.) 3
0 1 2
0 2 1
1 0 2
1 2 0
2 0 1
2 1 0
这里用到了动词：A.“易位词”（anagram），x A. y的左参数x，指定了长度为#y的所有置换中给特定一个置换的编号，其对应的置换向量在组合数学中被称为逆序向量，据此编号置换y的项目。这里求全排列的数目，用到了一元动词!“阶乘”。接着在p3的基础上，实现置换长度为4的全排列矩阵：
=/~ @ i. ] 4             NB. 生成4×4单位矩阵
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
   \:"1 @ (=/~) @ i. ] 4    NB. 生成第1列为0 1 2 3，每行后3个元素升序的4×4“奇妙”矩阵
0 1 2 3
1 0 2 3
2 0 1 3
3 0 1 2
   0&,. @: +&1 p3           NB. 对3元素全排列的每个元素增1，并在每个排列头部添0
0 1 2 3
0 1 3 2
0 2 1 3
0 2 3 1
0 3 1 2
0 3 2 1
   perm0=: (0&,.@:+&1 p3) {"(_ 1) \:"1@(=/~)@i.
   <"_1 perm0 4
┌───────┬───────┬───────┬───────┐
│0 1 2 3│1 0 2 3│2 0 1 3│3 0 1 2│
│0 1 3 2│1 0 3 2│2 0 3 1│3 0 2 1│
│0 2 1 3│1 2 0 3│2 1 0 3│3 1 0 2│
│0 2 3 1│1 2 3 0│2 1 3 0│3 1 2 0│
│0 3 1 2│1 3 0 2│2 3 0 1│3 2 0 1│
│0 3 2 1│1 3 2 0│2 3 1 0│3 2 1 0│
└───────┴───────┴───────┴───────┘
   $ perm0 4
4 6 4
这里的{"(_ 1)，其左侧是从6×3全排列矩阵加工而成6×4选取矩阵，用它分别对其右侧的4×4“奇妙”矩阵的每一行进行主轴索引运算，即将选取矩阵每行第1个元素保持为“奇妙”矩阵此行的第1个元素，而每行后面3个元素是对“奇妙”矩阵此行后面3个元素的排列。这一步写出的排列动词的结果是4×6×4的三维阵列，将它重制形状为24×4全排列矩阵：
perm1=: (,~ !) $ ,@((0&,.@:+&1 p3) {"(_ 1) \:"1@(=/~)@i.)
   $ p4=: perm1 4
24 4
二元动词$的左参数的值为(!y) , y，这里的y是给排列动词的数据参数；而它的右参数是用一元动词,将三维阵列散开后形成的一个向量。
然后将其中的p3，替代为递归的自引用$:@-&1；并通过名词秩，形成常量动词(1 0$0)"_，设置长度为0时的基础值为1 0$0：
perm=: (1 0$0)"_ ` ((,~ !) $ ,@(0&,.@:+&1@$:@-&1 {"(_ 1) \:"1@(=/~)@i.)) @. (>&0) : [:
   (perm 4) -: p4
1
   $ perm 0
1 0
   $ perm 1
1 1
   invertVec=: I.@(, -:"1 perm@#) : ({ perm)
   1 _1 invertVec 4
0 1 3 2
3 2 1 0
   invertVec 3 2 1 0
23
最后将递归形式改为迭代形式，可采用连词F..“单结果正向折叠”（fold single forward），使用它需要事先安装插件dev/fold。这个连词所形成的动词，从左至右遍历右参数列表，将其项目逐个作为动词运算元所见到的左参数；它的左参数是迭代对象的初始值，动词运算元所见到的右参数是迭代对象：
load 'dev/fold/foldr'
   perm=: (1 0$0)&(]F..((,~ !)@[ $ ,@(0&,.@:+&1@] {"(_ 1) \:"1@(=/~)@i.@[)))@:(>:@i.) : [:
如果不采用连词F..，可以基于一元副词/“插入”，自行实现正向折叠算子：
foldl=: {{m"_ ` (v&:>/@,&(<m)@(<"_1@|.)) @. (>&0@#)}}
   perm=: (1 0$0)foldl((,~ !)@[ $ ,@(0&,.@:+&1@] {"(_ 1) \:"1@(=/~)@i.@[))@:(>:@i.) : [: