\ http://www.complang.tuwien.ac.at/forth/gforth/Docs-html/Tutorial.html \ all `ass*' words are `( -- )' if not stated otherwise. : rr ( -- ) s" 2hw.fs" included ; : :r rr ; \ ghci style \ ============================== 3.24 ======================================== \ Assignment: Emit ( c -- ) types c as character (not a number). Implement \ type ( addr u -- ). : type ( addr u -- ) swap 1 chars - swap 0 u+do char+ dup c@ emit loop drop ; \ ============================== 3.27 ======================================== \ Assignment: How could you modify copy-file so that it copies until a second \ line is matched? Can you write a program that extracts a section of a text \ file, given the line that starts and the line that terminates that section? s" 1hw.fs" r/o open-file throw Value fd-in s" lol.out" w/o create-file throw Value fd-out 512 Constant max-line Create line-buffer max-line 2 + allot \ TODO : copy-file ( -- ) begin line-buffer max-line fd-in read-line throw while line-buffer swap fd-out write-line throw repeat ; \ ============================== 3.29 ======================================== : map-array ( ... addr u xt -- ... ) \ executes xt ( ... x -- ... ) for every element of the array starting \ at addr and containing u elements { xt } cells over + swap ?do i @ xt execute 1 cells +loop ; \ ============================== 3.31 ======================================== : defer create ['] abort , does> @ execute ; : is ' >body ! ; \ aufruf: \ > defer lulz \ > lulz ( abort ) \ > s" lulz" find-name 48 dump ( mitschrift, leet hax ) \ > ' + is lulz \ > 2 3 lulz . ( 5 ) \ > s" lulz" find-name 48 dump ( mitschrift, leet hax ) \ ============================== 3.33 ======================================== : my-2dup postpone over postpone over ; immediate : foodup my-2dup ; \ see foodup \ ============================== 3.34 ======================================== : ]L ] postpone literal ; \ ============================== 3.37 ======================================== : >order { wid -- } get-order wid swap 1+ set-order ; \ > order \ > forth-wordlist >order \ > order \ "ich schieb nochmal `Forth' rauf" \ ===== misc stuff \ \ wie mach ich eine "gegenseitige" rekursion? \ > defer x \ > : y x ; \ > : (x) y ; \ > ' (x) is x \ \ controlbla... \ > : foo \ > begin x if y then x until ; \ das `then' macht backpatching ! \ > see foo \ ist falsch, weil buggy `see' :/ \ > simple-see foo \ \ major hax0r \ > hex \ HAX \ > : bar if x \ > [ .s ] \ jetzt wird zeug am stack vom compilezeit stuff angezeigt, w00t \ > else \ > [ .s ] \ > y then \ > [ .s ] \ > ; \ > simple-see bar \ \ `?branch' bedingter sprung, `branch' unbedingter sprung \ btw, `cs-roll' manipuliert den stack zur compilezeit... (?)