【发布时间】:2011-10-28 17:51:19
【问题描述】:
我正在尝试创建一个函数mod3,它返回输入模三,但我的语法错误。我不明白为什么语法与文档中的 double 示例有任何不同。
$ jconsole
double =: * & 2
double 1
2
double 2
4
double 3
6
mod3 =: 3 | &
|syntax error
| mod3=: 3|&
【问题讨论】:
我正在尝试创建一个函数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
但是残差 (|) 不是可交换的,因此在您的情况下,您必须确保修复/绑定(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
【讨论】:
| 接受一个左参数和一个右参数,为什么中缀3 | 2 自己工作,但定义函数时必须使用postix 3 & |?不一致。
| 使用的左参数,因此我们使用连词& 将左参数绑定到它。另一种方法是使用 fork 并定义 mod3=: 3 | ]
3 & | 是“后缀”吗?难道你不能说从连词&的角度来看,这个陈述是中缀的吗?
1 + 2。前缀:+ 1 2。后缀:1 2 +。在函数声明之外使用模函数时,使用中缀:3 | 4。但是,当您在函数声明中使用模数时,您必须使用前缀 | & 3 或后缀 3 & |。根据 Wikipedia 对 APL 从左到右的操作顺序的描述,我预计 J 甚至没有中缀(“二元”)函数,只有前缀函数,就像 Lisp 一样。
& 是修饰语,3&| 是动词的中缀短语。它不是动词 | 的后缀用法,因为 | 是 & 的参数。由3&| 产生的整个动词在其右侧有一个参数(例如 7)。
我不知道为什么 J,一种主要是前缀的语言,使用这种语法,但邮件列表说使用这个版本,它可以工作。
mod3 =: 3 & |
【讨论】:
在我看来,重点是当你有一个二元动词,并且你将一个论点与它结合起来时,它就变成了一个单元动词。一元动词的论点始终为 y(J 术语)或右侧。
示例: ^&3] 4 64 ] 分隔 3 4 以便它们不被视为单个数字。我从一个二元动词 power 开始,将 x 设为 y 次方。通过添加绑定,我创建了一个单元动词,按照它的定义,它具有 y 的三次方。
3&^ 4
81
这基本上是相同的例子,只是现在我的一元动词是“将 3 的 y 次方”。
双重示例(更简洁的 +:) 试图展示的正是我们所展示的:通过键转换为一元动词的二元动词总是将它需要执行的单个参数作为正确的参数,无论第一个参数绑定到哪一边。
它没有显示的是,对于不可交换的动词,将原始参数绑定到哪一侧很重要。但现在你知道了。 :-)
【讨论】: