2016-10-03 59 views
2

我正在玩因子試圖獲得一點連貫編程的理解。寫一個字方一些很簡單:如何在多維數據集中創建數字?

: square (n -- n) dup * ; 

但對我的生活中,我似乎無法弄清楚如何立方體號碼:

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

不因爲工作推斷的堆疊效應是(x x x -- x)類似地

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

也失敗。

如果我硬編碼的立方體我會做這樣的事情:

3 3 * 3 * 

也正因爲此,我天真的猜測是B型。

正如我所說我只是在玩Factor,並且很想知道我在這裏錯過了什麼 - 但它主要是爲了我的好奇心。

回答

2

沒有爲一個內置Word:

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 
+0

你必須添加math.functions詞彙爲了讓「^」工作。次要的事情,但如果其他人碰到這個,只是想確保它是明顯的。 –

+0

也有一種方法來推廣這個詞的'3 ^'部分?我的意思是''cube(n - n)3 [^];'(這不起作用:)) –

+0

嗯,我想你可以把它寫成':cube(n - n')3 ^; ' –

2

如果任何人碰到這個運行,並想知道如何做到這一點:

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

dup dup將值添加到堆棧的頂部兩次,然後將* *將成倍的兩倍。我敢打賭,做這件事的方式不太簡單,但正如我所說,如果其他人很好奇。

+0

我認爲這是什麼,你其實是想),你硬編碼的版本應該是'3 3 3 * *' –

2

這可能是有趣的你:

: 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:迭代冪次:

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

你也許還概括另一種方式,實現像Knu這樣的超級操作向上的箭頭。 這對我來說並不是很明顯,對此如何去做, ,但Björn的回答似乎暗示了這一點。 實際的源代碼有很多針對不同數據類型優化的抽象層。 點擊直通直到它到達(^fixnum)給出類似的東西

+0

BjörnLindqvist用'times'這個詞做了一個概括'dup dup ... op op ...'的方法。另一個是數組。 ':power(b e - n)swap product; 5 2力量! - > 25'(用'sum'替換'product',或使用'reduce'或'each')。 –

+0

請注意,'3 3^3 ^'不同於'3 3 3^^'。你想要的是'[dup ^] keep ^'。泛化:':tetrate(x y - n)1 - 各自超過 [^];' –

相關問題