2

我正在和 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,并且很想知道我在这里缺少什么——但这主要是出于我的好奇心。

4

3 回答 3

3

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

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

dup dup会将值添加到堆栈顶部两次,然后将* *乘以两次。我敢打赌,有一种不那么老套的方法可以做到这一点,但正如我所说,以防其他人好奇。

于 2016-10-04T14:24:55.043 回答
3

有一个内置词:

IN: scratchpad 3 3 ^ .
27

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

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

您还可以cube使用以下公式制定square

: cube ( n -- n' ) dup square * ;
IN: scratchpad 6 cube .
216
于 2016-10-20T22:41:47.997 回答
3

这可能会让你感兴趣:

: 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..]

那么下一个高阶操作呢: Tetration:

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

You could probably also generalize the other way, implementing hyper-operations like Knuth's up arrow. It's not immediately apparent to me how one would go about doing that, but Björn's answer seems to hint at it. The actual source has a lot of abstraction layers optimizing for the different datatypes. Clicking thru until it reaches (^fixnum) gives something similar

于 2017-04-12T10:09:13.317 回答