入力形式ed
を模倣するテキストエディタを作成しようとしています。 ed
では、一度に1行ずつ入力し、1行に1つの.
を入力すると終了します。ここに私が思い付いたものです:ループへの入力の引用が期待される効果と一致しません
0 [
[ readln [ "." = not ] keep swap ] dip 1 + swap
] loop
nip 1 - narray
このスニペットは時にユーザ1つのラインからの入力を取得し、それは単一のドットに達したときに停止し、文字列の配列を返します。
私はすぐに私は言葉にそれを配置しようとして、それは自分自身でいたときにすべてのエラーを取得しますが、しないでください:
: getinput (-- input)
0 [
[ readln [ "." = not ] keep swap ] dip 1 + swap
] loop
nip 1 -
narray
;
は、私は次のエラーを取得する:
The input quotation to “loop” doesn't match its expected effect
Input Expected Got
[ ~quotation~ dip 1 + swap ] (... -- ... ?) (x -- x x x)
(U) Quotation: [ c-to-factor -> ]
...
私は、コンパイラがスタック宣言を気にすることなく、それが単語ではないときには何かであると思う。ループの下のスタックを変更することに不満はありますか?私はcall()
について知っていますが、もし私がここでそれを使う必要があれば、どうですか?
編集:私もちょうど、以下を試してみました:
:: getinput (-- input)
0 :> count!
[ [ "." = not ] keep swap ]
[ readln count 1 + count! ] do while
drop count 1 - narray
;
私は、同様のエラーを取得し、しかし、スタック効果が若干異なります:再び
The input quotations to “while” don't match their expected effects
Input Expected Got
[ ~quotation~ keep swap ] (..a -- ..b ?) (x -- x x)
[ _ 1 load-locals readln 0 get-local local-value 1 + 0 get-local... (..b -- ..a) (-- x)
(U) Quotation: [ c-to-factor -> ]
...
、独自に罰金しかし言い換えれば、それはコンパイルされません。
ニースを、ちょうどスタックはローカル変数や関数の引数としてではなく、任意のデータ構造と同じ目的のために使用されていると思います。私はこの小さな調整をお勧めしたい:1) 'dup '。" = ''の代わりに ''。 =]スワップを維持する。 2) '1array append'の代わりに' {} 'と' suffix! 'の代わりに 'V {} clone'を使います。結果として配列が必要な場合は、最後に '> array'を実行することができます。この方法では、追加するたびに新しいものを割り当てることはありません。 (接尾辞と追加の違いは、突然変異の有無に関係なく適用されます)。 –