我正在尝试编写一个文本编辑器来模仿ed
. 在ed
中,您一次写入一行输入,并在您输入一行时完成.
。这是我想出的:
0 [
[ readln [ "." = not ] keep swap ] dip 1 + swap
] loop
nip 1 - narray
此代码段一次从用户那里获取一行输入,当它到达一个点时停止,并返回一个字符串数组。
当它单独出现时,我没有收到任何错误,但是一旦我尝试把它变成一个词:
: 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 -> ]
...
同样,它本身很好,但总而言之,它不能编译。