Hallo,
In einem Gespraech mit Wolfgang kam mir ploetzlich die Idee wie
man Rekursion mit der kommando-sprache des uEMACS implentieren
kann.
Als kleines Test-programm habe ich dann Hanoi geschrieben ...
einfach den File mit dem emacs interpretieren und dann mit
'run hanoi' die Prozedur starten .....
Achja: 'Banner' sollte vorhanden sein ....
Viel Spass .....
Reimer
-------------------------------------------------------------
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of shell archive."
# Contents: hanoi.cmd
# Wrapped by ram@ramsys on Tue Dec 6 23:07:19 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'hanoi.cmd' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'hanoi.cmd'\"
else
echo shar: Extracting \"'hanoi.cmd'\" \(3477 characters\)
sed "s/^X//" >'hanoi.cmd' <<'END_OF_FILE'
X; Hanoi for the uEMACS 3.9e
X; Author: Reimer A. Mellin (ram@altger)
X; Date: 6.12.1988
X; implements recursion with a special buffer :-)
X
X; Well, why shouldn't it work ?
X
Xstore-procedure push
X select-buffer [stack]
X insert-string %pusharg
X newline
X!endm
X
X
Xstore-procedure pop
X select-buffer [stack]
X previous-line
X kill-to-end-of-line
X run readarg
X!endm
X
X
Xstore-procedure readarg
X select-buffer [stack]
X set-mark
X previous-line
X exchange-point-and-mark
X copy-region
X set %number &left $kill 1
X set %src &mid $kill 2 1
X set %aux &mid $kill 3 1
X set %dest &mid $kill 4 1
X!endm
X
X
Xstore-procedure init-screen
X beginning-of-file
X set-mark
X end-of-file
X kill-region
X set %i 0
X !while ¬ &equ %i &sub 10 %number
X insert-string &cat %trenner &cat %disk0
X insert-string &cat %trenner &cat %disk0
X insert-string &cat %trenner &cat %disk0
X newline
X set %i &add %i 1
X !endwhile
X set %j 1
X !while ¬ &equ %i 10
X set %ivar &cat "%disk" %j
X insert-string &cat %trenner &cat &ind %ivar
X insert-string &cat %trenner &cat %disk0
X insert-string &cat %trenner &cat %disk0
X newline
X set %i &add %i 1
X set %j &add %j 1
X !endwhile
X update-screen
X set %j @"Press Return to start the fun ..."
X set $discmd FALSE
X!endm
X
X
Xstore-procedure init-vars
X set %disk9 "###################"
X set %disk8 " ################# "
X set %disk7 " ############### "
X set %disk6 " ############# "
X set %disk5 " ########### "
X set %disk4 " ######### "
X set %disk3 " ####### "
X set %disk2 " ##### "
X set %disk1 " ### "
X set %disk0 " # "
X set %trenner " "
X set %ynoL %number
X set %ynoM 0
X set %ynoR 0
X set %xnoL 5
X set %xnoM 29
X set %xnoR 53
X!endm
X
X
Xstore-procedure moveone
X select-buffer [output]
X beginning-of-file
X set %yvar &cat "%yno" %src
X set %xvar &ind &cat "%xno" %src
X &sub 10 &ind %yvar next-line
X set %old &mid $line %xvar 19
X %xvar forward-character
X 19 delete-next-character
X insert-string %disk0
X set &ind %yvar &sub &ind %yvar 1
X
X beginning-of-file
X set %yvar &cat "%yno" %dest
X set &ind %yvar &add &ind %yvar 1
X set %xvar &ind &cat "%xno" %dest
X &sub 10 &ind %yvar next-line
X &sub %xvar 1 forward-character
X 19 delete-next-character
X insert-string %old
X
X beginning-of-file
X update-screen
X!endm
X
X
Xstore-procedure move
X run readarg
X !if &equ %number 1
X run moveone
X !return
X !endif
X set %pusharg &cat &sub %number 1 &cat %src &cat %dest &cat %aux
X run push
X run move
X run pop
X run moveone
X set %pusharg &cat &sub %number 1 &cat %aux &cat %src &cat %dest
X run push
X run move
X run pop
X!endm
X
Xstore-procedure hanoi
X set %olddiscmd $discmd
X delete-other-windows
X set %savebuf $cbufname
X select-buffer [output]
X pipe-command "banner 'Towers of'"
X set %savebuf1 $cbufname
X set-mark
X end-of-file
X copy-region
X next-window
X yank
X delete-other-windows
X delete-buffer %savebuf1
X pipe-command "banner ' Hanoi!'"
X set-mark
X end-of-file
X copy-region
X next-window
X yank
X insert-string "for uEMACS 3.9e (and higher) by Reimer A. Mellin ....."
X delete-other-windows
X delete-buffer %savebuf1
X update-screen
X*label1
X set %number @"How may Disks (1-9) ?"
X !if &or &sgr %number "9" &sle %number "1"
X !goto label1
X !endif
X run init-vars
X run init-screen
X set %pusharg &cat %number "LMR"
X run push
X run move
X select-buffer [stack]
X unmark-buffer
X select-buffer [output]
X set %number @"Finished .... Press Return ....."
X unmark-buffer
X select-buffer %savebuf
X delete-buffer [stack]
X delete-buffer [output]
X set $discmd %olddiscmd
X!endm
END_OF_FILE
if test 3477 -ne `wc -c <'hanoi.cmd'`; then
echo shar: \"'hanoi.cmd'\" unpacked with wrong size!
fi
# end of 'hanoi.cmd'
fi
echo shar: End of shell archive.
exit 0
-----------------------------------------------------------------------
--
Reimer Mellin, +49 89 7913668, ram@ramsys, ...!{chiuur,doitcr}!ramsys!ram
--
| Frank Kaefer | f...@stasys.sta.sub.org | Starnberg, Germany |
| Compuserve: 72427,2101 | Internet: frank....@Sun.COM |
| unido!sunde!fkaefer | fka...@Germany.Sun.COM |