是否有可能根据执行时间值编写一个使用monadic或二元形式的动词的J程序?

时间:2014-11-10 20:15:59

标签: j

很明显3 * 4导致12,而* 4导致1,但是对于这两种操作使用相同的原语提供了一个好处?例如,让我们说我要定义以下内容:

SIGNUM =: * : [:
TIMES =: [: : *

如果我只使用SIGNUMTIMES代替*,我会错过巧妙使用*吗?也就是说,对于我能想象到的每个x TIMES yx * y似乎与x完全相同(尽管我的想象在这方面非常有限)。是否有x x * ySIGNUM 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

2 个答案:

答案 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