很明显3 * 4
导致12
,而* 4
导致1
,但是对于这两种操作使用相同的原语提供了一个好处?例如,让我们说我要定义以下内容:
SIGNUM =: * : [:
TIMES =: [: : *
如果我只使用SIGNUM
和TIMES
代替*
,我会错过巧妙使用*
吗?也就是说,对于我能想象到的每个x TIMES y
,x * y
似乎与x
完全相同(尽管我的想象在这方面非常有限)。是否有x
x * y
与SIGNUM y
生成相同的结果?
如果* : [:
没有立即清除,则以下内容应说明:
SIGNUM =: * : [:
TIMES =: [: : *
SIGNUM 4
1
3 TIMES 4
12
* 4
1
3 * 4
12
3 SIGNUM 4
|domain error: SIGNUM
| 3 SIGNUM 4
TIMES 4
|domain error: TIMES
| TIMES 4
答案 0 :(得分:1)
让我们从评论中写下结论:
没有直接的语言级别的理由不使用基元名称
使用名称而不是基元 可能会损害性能,因为special code不一定会被触发。我认为可以通过使用f.
构建动词来修复动词来解决这个问题。
monadic和dyadic动词具有相同名称的原因是历史的:APL之前使用过它。大多数动词都有monadic / dyadic版本和变形的相关动作(一些尾随点和冒号)。
例如,^
可以用传统表示法表示为pow(x,y)
或exp(y)
,其中x和y是左右参数,e是欧拉常数。这里,monadic版本与二元版本相同,具有合理的默认左参数。同根的不同变形都是与动力相关的动词:
- ^.
执行对数(monad的基数e)
- ^:
执行Power连接,动词可变次数。
monadic和dyadic动词之间的其他关系也可以存在,例如$
可以说是获取或设置数组的形状,具体取决于它是用作monad还是dyad。
那就是说,我认为一旦有人获得J的一些经验,就可以更容易地根据它所用的句子来找出动词的效价。例如:
Monad @ Ambiv NB. Mv is always used monadically, Av depends on arguments
Ambiv & Monad
(Dyad Monad) NB. A hook, where verb 1 is always dyadic
(Ambiv Dyad Ambiv) NB. A fork, the middle is one always dyadic
答案 1 :(得分:1)
对于二元和一元内置函数使用相同的符号可能是错误的,除了那些monadic case是二元组的默认参数的那些。
TIMES =:1& $ :: *
将是一个很好的定义,不会给出错误。
至于矛盾的情况,
(3 * TIMES)4
12个
2(3 * TIMES)4
24
另一个有用的矛盾动词是:
TIMESORSQUARE =:*〜
* ~3
9
2 * ~3
6