Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.forth > #45572
| From | anton@mips.complang.tuwien.ac.at (Anton Ertl) |
|---|---|
| Newsgroups | comp.lang.forth |
| Subject | Re: Rosetta code reverse a string |
| Date | 2016-02-16 13:44 +0000 |
| Organization | Institut fuer Computersprachen, Technische Universitaet Wien |
| Message-ID | <2016Feb16.144414@mips.complang.tuwien.ac.at> (permalink) |
| References | <e69b019d-9102-4232-b3e0-c6b524056bfd@googlegroups.com> <87d1rx8t35.fsf@jester.gateway.pace.com> |
Paul Rubin <no.email@nospam.invalid> writes:
>create buf 1000 chars allot
>buf value pp
>
>: tr ( caddr u -- ) dup >r pp swap cmove r> pp + to pp ;
>: collect begin parse-name dup while tuck pp >r tr r> swap repeat ;
>: >> buf to pp collect 2drop depth 2/ 0 ?do type bl emit loop cr ;
>
>>> ---------- Ice and Fire ------------
>>>
>>> fire, in end will world the say Some
>>> ice. in say Some
>>> desire of tasted I've what From
>>> fire. favor who those with hold I
>>>
>>> ... elided paragraph last ...
>>>
>>> Frost Robert -----------------------
Nice use of the input stream to provide the input. This allows to
use PARSE-NAME, which has much of the needed functionality already.
It also avoids the need to pass the input string around on the stack.
There is an improvement possible using the technique described by John
Hayes in the SigForth Newsletter 4(2), Fall '92, for implementing {
for locals (and improved in the Forth-2012 reference implementation):
: revline ( "line" -- )
parse-name dup if
recurse type space exit then
2drop ;
: >> ( "line" -- )
revline cr ;
Here REVLINE just reverses the rest of the line before printing the
token it has parsed. Note that PARSE-NAME cannot be replaced with BL
WORD COUNT here, because several invocations of WORD may use (and
typically do use) the same buffer.
This example is also nice for demonstrating that we can use the
implicit input through the input stream to make the stack handling
simpler, and can then turn that into an on-stack input with
EXECUTE-PARSING.
: .reverse ( c-addr u -- )
['] revline execute-parsing ;
Likewise, we can turn the implicit output to the user terminal into an
explicit output on the stack with >STRING-EXECUTE (Gforth development
version):
: reverse-string ( c-addr1 u1 -- c-addr2 u2 )
['] .reverse >string-execute ;
Compare this to what you would have to do to program this without
going through the input stream and without using the implicit-output
words TYPE and SPACE.
- anton
--
M. Anton Ertl http://www.complang.tuwien.ac.at/anton/home.html
comp.lang.forth FAQs: http://www.complang.tuwien.ac.at/forth/faq/toc.html
New standard: http://www.forth200x.org/forth200x.html
EuroForth 2015: http://www.rigwit.co.uk/EuroForth2015/
Back to comp.lang.forth | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
Rosetta code reverse a string foxaudioresearch@gmail.com - 2016-02-15 13:22 -0800
Re: Rosetta code reverse a string Paul Rubin <no.email@nospam.invalid> - 2016-02-15 15:14 -0800
Re: Rosetta code reverse a string foxaudioresearch@gmail.com - 2016-02-15 16:49 -0800
Re: Rosetta code reverse a string Paul Rubin <no.email@nospam.invalid> - 2016-02-15 20:27 -0800
Re: Rosetta code reverse a string anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2016-02-16 07:25 +0000
Re: Rosetta code reverse a string Doug Hoffman <glidedog@gmail.com> - 2016-02-16 05:30 -0500
Re: Rosetta code reverse a string Albert van der Horst <albert@spenarnc.xs4all.nl> - 2016-02-16 11:55 +0000
Re: Rosetta code reverse a string anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2016-02-16 13:44 +0000
Re: Rosetta code reverse a string Albert van der Horst <albert@spenarnc.xs4all.nl> - 2016-02-16 14:45 +0000
Re: Rosetta code reverse a string anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2016-02-16 16:22 +0000
Re: Rosetta code reverse a string Paul Rubin <no.email@nospam.invalid> - 2016-02-16 13:25 -0800
Re: Rosetta code reverse a string anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2016-02-17 07:07 +0000
Re: Rosetta code reverse a string Paul Rubin <no.email@nospam.invalid> - 2016-02-16 23:29 -0800
Re: Rosetta code reverse a string Albert van der Horst <albert@spenarnc.xs4all.nl> - 2016-02-16 11:46 +0000
Re: Rosetta code reverse a string "WJ" <w_a_x_man@yahoo.com> - 2016-02-16 18:25 +0000
Re: Rosetta code reverse a string humptydumpty <ouatubi@gmail.com> - 2016-02-16 13:40 -0800
Re: Rosetta code reverse a string "WJ" <w_a_x_man@yahoo.com> - 2016-06-28 01:55 +0000
Re: Rosetta code reverse a string "HAA" <someone@microsoft.com> - 2016-06-29 11:45 +1000
csiph-web