我正在玩因素试图对连接编程有一点了解。写一个单词来表示数字是微不足道的:
: square ( n -- n ) dup * ;
但是对于我的生活,我似乎无法弄清楚如何将数字立方体化:
: cube ( n -- n ) * * ; ! Form a
不起作用,因为推断的堆栈效果是( x x x -- x )
类似
: cube ( n -- n ) dup * * ; ! Form b
也失败了。
如果我要对立方体进行硬编码,我会做这样的事情:
3 3 * 3 *
这就是为什么我的天真猜测会形成b。
正如我所说,我只是在玩因素而且很想知道我在这里缺少什么 - 但这主要是出于我的好奇心。
答案 0 :(得分:3)
如果其他人遇到这种情况并希望知道如何执行此操作:
: cube ( n -- n ) dup dup * * ;
dup dup
会将值添加到堆栈顶部两次,然后* *
将乘以两次。我打赌这样做的方式不那么简单,但正如我所说的,万一其他人都很好奇。
答案 1 :(得分: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
答案 2 :(得分: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..]
)
下一个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)
会给出类似的内容