如何对一个数进行因数立方?

How To Cube A Number In Factor?

我正在玩 Factor 试图对连接编程有一点了解。写一个词来平方一个数字是微不足道的:

: square ( n -- n ) dup * ;

但对于我来说,我似乎无法弄清楚如何计算一个数的立方:

: cube ( n -- n ) * * ;  ! Form a

不起作用,因为推断的叠加效果是( x x x -- x )类似

: cube ( n -- n ) dup * * ; ! Form b

也失败了。

如果我要对立方体进行硬编码,我会这样做:

3 3 * 3 *

这就是为什么我天真的猜测是形式 b。

正如我所说,我只是在玩 Factor,很想知道我在这里遗漏了什么——但这主要是出于我的好奇心。

以防其他人遇到此问题并想知道如何执行此操作:

: cube ( n -- n ) dup dup * * ;

dup dup会将值加到栈顶两次,然后* *会相乘两次。我敢打赌,有一种更简单的方法可以做到这一点,但正如我所说,以防其他人好奇。

有一个内置词:

IN: scratchpad 3 3 ^ .
27

或者如果你想自己写这个词:

: pow ( x n -- y ) 1 - over '[ _ * ] times ;
IN: scratchpad 5 3 pow .
125

您也可以使用 square:

来表示 cube
: cube ( n -- n' ) dup square * ;
IN: scratchpad 6 cube .
216

您可能对此感兴趣:

: double ( n -- n ) dup + ;   ! add 2 times
: square ( n -- n ) dup * ;   ! multiply 2 times

那么3次呢?

: triple ( n -- n ) dup dup + + ;   ! add 3 times
: cube   ( n -- n ) dup dup * * ;   ! multiply 3 times

(不知道有没有办法泛化这个模式[..a a a b b b..]

下一个higher order operation呢:Tetration:

: tetrate2 ( n -- n ) dup ^ ;         ! raise to power twice
: tetrate3 ( n -- n ) dup dup ^ ^ ;   ! raise to power thrice

您可能还可以概括另一种方式,实现超操作,如 Knuth 的向上箭头。 我不是很清楚如何去做那件事, 但 Björn 的回答似乎暗示了这一点。 实际源代码有很多针对不同数据类型进行优化的抽象层。 单击直到到达 (^fixnum) 会给出类似的结果