26

仕様が主題について言うこと:

反復ループの形式は次のとおりです。

IM IN YR <label> <operation> YR <variable> [TIL|WILE <expression>]  
  <code block>
IM OUTTA YR <label>

<operation>は、UPPIN(1ずつインクリメント)、NERFIN(1ずつデクリメント)、または任意の単項関数です。その操作/関数は、一時的でループに対してローカルな<変数>に適用されます。TIL <expression>は、式をTROOFとして評価します。FAILと評価された場合、ループはもう一度続行され、そうでない場合、ループの実行は停止し、一致するIM OUTTAYR<label>の後に続行されます。WILE <expression>はその逆です。式がWINの場合、実行は続行されます。それ以外の場合、ループは終了します。

質問

仕様に対する私の不満は、次の組み合わせです。

  • ループ変数初期化子の欠如
  • 一時的でループに対してローカルであるという事実

私が理解しているように、これは0から開始する必要があることを意味します。

これは、のほとんどの使用法ではほとんど問題ありませんがUPPIN、ほとんどの(私の)意図された使用法では完全にオフですNERFIN。他の言語でのデクリメントループ変数の私の最も一般的な使用法は、「n回繰り返す(nは再利用されない)」イディオムと文字列操作です。これは、とにかくLOLCODEではお勧めできません。

ループの同等の形式または操作不要の形式のループよりも冗長でない方法で、ループをnNERFINから1または0にデクリメントするために使用することは可能ですか?UPPIN

代替案の比較

UPPINバリアントを使用して543 21を印刷します。

IM IN YR LOOPZ UPPIN YR COWNTR TIL BOTH SAEM COWNTR AN 5
  VISIBLE DIFF OF 5 AN COWNTR
IM OUTTA YR LOOPZ

長所:簡潔。
短所:実際のループ変数に直接アクセスすることはできません。

操作不要のバリアントの場合:

I HAS A COWNTR ITZ 5
IM IN YR LOOPZ
  VISIBLE COWNTR
  COWNTR R DIFF OF COWNTR AN 1
  BOTH SAEM COWNTR AN 0, O RLY?
  YA RLY, GTFO, OIC
IM OUTTA YR LOOPZ

長所:ループ変数は直接利用できます。
短所:長い。

私が得ることができる最高のものNERFIN

IM IN YR LOOPZ NERFIN YR COWNTR TIL BOTH SAEM COWNTR AN -5
  VISIBLE SUM OF 5 AN COWNTR
IM OUTTA YR LOOPZ

長所:エラー...使用しNERFINますか?
短所:ループ変数に直接アクセスすることはできません。UPPINバリアントよりも読みにくい(ハァッ!) 。冗長性の向上はありません。

TLDRの質問、繰り返し

ループの同等の形式または操作不要の形式のループよりも冗長でない方法で、ループをnNERFINから1または0にデクリメントするために使用することは可能ですか?UPPIN

言語仕様レベル1.2でlciインタープリターを使用しています。

4

1 に答える 1

14

この正確なトピックについて、2007年から設計に関する議論がありました。当時のコンセンサスはFROM、ワーキンググループが1.2に早急に進めたいソリューションとしてを追加することを提案しているようでした。

http://forum.lolcode.com/viewtopic.php?pid=2484

問題は解決され、1.2仕様にはなりませんでした。ただし、明らかに1.3仕様に含まれています。

http://lolcode.com/proposals/1.3/loop2

ただし、まだ作業中です。確認しましたが、リポジトリの「future」ブランチにはまだありません。これは、ループインタープリターコードを調べることで確認できます。2011年8月24日現在(リビジョン72c983d0667d4d650657e1b7c5f4c7054096b0dd)でも、最初は常にループ変数aNUMBRに0を割り当てます。

https://github.com/justinmeza/lci/blob/72c983d0667d4d650657e1b7c5f4c7054096b0dd/interpreter.c#L3434

ただし、古い仕様でも、理論的にはTROOF-1に対するテストと組み合わせて使用​​して、5から0までの比較的クリーンなカウントダウンを可能にする必要があります。

BTW countdown-test.lol
CAN HAS STDIO?
HAI 1.2

HOW DUZ I COUNTDOWN YR BOWNDZ
    I HAS A FIRSTIES
    FIRSTIES R WIN
    IM IN YR LOOPZ NERFIN YR COWNTR TIL BOTH SAEM COWNTR AN -1
        FIRSTIES
        O RLY?
            YA RLY
                COWNTR R BOWNDZ
                FIRSTIES R FAIL
        OIC

        VISIBLE COWNTR

    IM OUTTA YR LOOPZ
IF U SAY SO

COUNTDOWN 5

KTHXBYE

残念ながら、ループ内のコードが以下を使用してループ変数を変更するのを防ぐ「効率ハック」がありますR

https://github.com/justinmeza/lci/blob/a6ef5811e8eb98935a16600b799bccbe4adffdde/interpreter.c#L3408

ただし、これは仕様の省略ではなくコードのバグのように思われるため、1.3リリースよりも前に修正される可能性が高くなります。パッチinterpreter.cを適用するとif (0 && stmt->update->type == ET_OP)、コードがcountdown-test.lol期待どおりに実行されます。パッチが適用されていないインストールとコードを共有する必要がない場合は、既存の1.2LOLCODEデプロイメントに適した暫定的なソリューションになる可能性があります。

于 2011-08-24T05:47:32.847 に答える