2

連結プログラミングを少し理解するために、Factor をいじっています。数を 2 乗する単語を書くのは簡単です。

: square ( n -- n ) dup * ;

しかし、私の人生では、数値を3乗する方法を理解できないようです:

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

( x x x -- x )推測されたスタック効果が同様であるため、機能しません

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

も失敗します。

キューブをハードコーディングするとしたら、次のようにします。

3 3 * 3 *

これが、私の素朴な推測がフォーム b になる理由です。

私が言うように、私は Factor で遊んでいるだけで、ここで何が欠けているか知りたいと思っていますが、それは主に私の好奇心のためです。

4

3 に答える 3

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

おそらく、Knuth の上向き矢印のようなハイパー操作を実装して、別の方法で一般化することもできます。どうやってそれを行うのかはすぐにはわかりませんが、ビョルンの答えはそれを示唆しているようです. 実際のソースには、さまざまなデータ型を最適化する多くの抽象化レイヤーがあります。到達するまでクリックスルーすると、(^fixnum)同様の結果が得られます

于 2017-04-12T10:09:13.317 に答える
3

他の誰かがこれに出くわし、これを行う方法を知りたい場合:

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

dup dupは値をスタックの一番上に 2 回追加し、次に は2* *回乗算します。これを行うためのハックの少ない方法があるに違いありませんが、私が言うように、他の誰かが興味を持っている場合に備えて.

于 2016-10-04T14:24:55.043 に答える