我正在尝试创建一个mod3
返回输入模三的函数,但我的语法错误。我不明白为什么语法double
与文档中的示例有任何不同。
$ jconsole
double =: * & 2
double 1
2
double 2
4
double 3
6
mod3 =: 3 | &
|syntax error
| mod3=: 3|&
当&
(bond) 用于将名词绑定到动词时,它本质上是创建一个带有“固定”左(或右)参数的新动词。因为乘法是可交换的,所以将 固定为左参数或右参数都没有关系,2
因此以下是等价的:
double1= *&2 NB. new verb "times by 2"
double2=: 2&* NB. new verb "2 times"
double1 4
8
double2 4
8
但是 residule ( |
) 不是可交换的,因此在您的情况下,您必须确保修复/绑定(3
作为 的左参数|
以获得所需的结果(数字的余数除以 3)。
modulo3=: 3&| NB. new verb "remainder after divison by 3"
modulox=: |&3 NB. new verb "remainder of 3 divided by"
modulo3 7
1
modulox 7
3
我不确定为什么 J,一种主要是前缀的语言,使用这种语法,但邮件列表说使用这个版本,并且它有效。
mod3 =: 3 & |
在我看来,关键是当你有一个二元动词,并且你将一个论点与它结合起来时,它就变成了一个单元动词。一元动词的论点始终为 ay(J 术语)或右侧。
示例:^&3] 4 64 ] 分隔 3 4 以便它们不会被视为单个数字。我从一个二元动词 power 开始,将 x 设为 y 次方。通过添加绑定,我创建了一个单子动词,按照它的定义,它具有 y 的三次方。
3&^ 4
81
这基本上是相同的示例,除了现在我的一元动词是“将 3 的 y 幂”。
双重示例(更简洁的 +:) 试图展示的正是我们所展示的:一个用键转换为一元动词的二元动词总是将它需要执行的单个参数作为正确的参数,不无论第一个论点与哪一方联系在一起。
它没有显示的是,对于不可交换的动词,将原始参数绑定到哪一方很重要。但现在你知道了。:-)