J'essaye d'écrire un éditeur de texte pour imiter le format d'entrée de ed
. Dans ed
, vous écrivez votre entrée une ligne à la fois et terminez lorsque vous entrez un seul .
sur une ligne. Voici ce que je suis venu avec:La citation d'entrée à la boucle ne correspond pas à l'effet attendu
0 [
[ readln [ "." = not ] keep swap ] dip 1 + swap
] loop
nip 1 - narray
Cet extrait obtient l'entrée de l'utilisateur une ligne à la fois, arrête quand il atteint un point unique, et retourne un tableau de chaînes.
Je ne reçois pas d'erreurs quand il est lui-même, mais dès que je tente de le mettre en un mot:
: getinput (-- input)
0 [
[ readln [ "." = not ] keep swap ] dip 1 + swap
] loop
nip 1 -
narray
;
Je reçois l'erreur suivante:
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 -> ]
...
Je pense que cela pourrait être quelque chose à faire avec le compilateur ne se soucie pas de la déclaration de la pile quand ce n'est pas dans un mot par opposition à quand il l'est. Est-il mécontent de modifier la pile sous la boucle? Je sais environ call()
, mais si j'ai besoin de l'utiliser ici, comment?
Edit: Je viens aussi essayé ce qui suit:
:: getinput (-- input)
0 :> count!
[ [ "." = not ] keep swap ]
[ readln count 1 + count! ] do while
drop count 1 - narray
;
je reçois une erreur semblable, mais les effets de la pile sont légèrement différentes:
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 -> ]
...
Encore une fois, bien sur son propre , mais en un mot, il ne compile pas.
Nice, il suffit de penser que la pile est utilisé pour les mêmes fins que vars locales et arguments de la fonction, et non comme une structure de données arbitraires. Je suggérerais ce tweaks mineur: 1) 'dup". " = 'au lieu de' ["." =] garder le swap'. 2) 'V {} clone' au lieu de' {} 'et' suffix! 'Au lieu de' 1array append'. Vous pouvez faire '> array' à la fin si vous avez besoin d'un tableau en conséquence. De cette façon, vous n'en attribuez pas de nouveau à chaque ajout. (La différence entre suffixe et append est applicable avec ou sans mutation). –