Ondertussen zijn we zo'n beetje voorbij de allereerste beginselen van Scheme. Dit gaat natuurlijk gepaard met weer geheel nieuwe, onduidelijke problemen. Zoals daar zijn:
> (set! a 1) [VM ERROR encountered!] SET! of an unbound variable A > (define a 1) > (set a 2) > a 2 > (define func (lambda (b) (set! b 4) (display b))) > (define b 5) > b 5 > (func 3) 4 > b 5 > (define func (lambda () (set! b 4) (display b))) > (func) > b 4 > (define func (lambda () (set! c 4) (display c))) > (func) [VM ERROR encountered!] SET! of an unbound lexical variable C
SET! of an unbound variable AHieruit leren we dat "set!" alleen maar gebruikt mag worden met variabelen die al eerder gebruikt zijn, en dat het probleem in dit geval bij de variabele "a" ligt.
Hier is een (nog niet volledige) lijst van PCSCHEME foutmeldingen.
[INSPECT] ? ctrl-A -- display All environment frame bindings ctrl-B -- display procedure call Backtrace ctrl-C -- display Current environment frame bindings ctrl-D -- move Down to callee's stack frame ctrl-E -- Edit variable binding ctrl-G -- Go (resume execution) ctrl-I -- evaluate one expression and Inspect the result ctrl-L -- List current procedure ctrl-M -- repeat the breakpoint Message ctrl-P -- move to Parent environment's frame ctrl-Q -- Quit (RESET to top level) ctrl-R -- Return from BREAK with a value ctrl-S -- move to Son environment's frame ctrl-U -- move Up to caller's stack frame ctrl-V -- eValuate one expression in current environment ctrl-W -- (Where) Display current stack frameAls voorbeeld hier de (identieke) functies func2, func3 en func4 (staan ook in "S:/terug/defin.txt").
(define func2 (lambda (ls) (if (null? ls) '() (cons (+ 1 (car ls)) (func3 (cdr ls)))))) (define func3 (lambda (ls) (if (null? ls) '() (cons (+ 1 (car ls)) (func4 (cdr ls)))))) (define func4 (lambda (ls) (if (null? ls) '() (cons (+ 1 (car ls)) (func4 (cdr ls)))))) > (func2 '(1 2 3)) (2 3 4) > (func2 '(1 2 a)) [VM ERROR encountered!] Non-numeric operand to arithmetic operation (+ 1 A) [INSPECT] CTRL-C Environment frame bindings at level 0 LS -- list -- [INSPECT] CTRL-L #<PROCEDURE FUNC4> = (lambda (ls) (if (null? ls) '() (cons (+ 1 (car ls)) (func4 (cdr ls))))) [INSPECT] CTRL-B Stack frame for #<PROCEDURE FUNC4> LS -- list -- called from #<PROCEDURE FUNC3> called from #<PROCEDURE FUNC2> called from () called from #<PROCEDURE EVAL> called from #<PROCEDURE ==SCHEME-RESET==> [INSPECT] CTRL-M [VM ERROR encountered!] Non-numeric operand to arithmetic operation (+ 1 A) [INSPECT] CTRL-V Value of: ls (A)
(define func4-2 (lambda (ls) (display "ls=") (display ls) (if (null? ls) (begin (display " -> stopconditie bereikt") (newline) '() ) (begin (display " -> recursie") (newline) (let ((first (car ls)) (rest (func4-2 (cdr ls)))) (display "first=") (display first) (display " rest=") (display rest) (newline) (cons (+ 1 first) rest)))))) > (func4-2 '(1 2 3)) ls=(1 2 3) -> recursie ls=(2 3) -> recursie ls=(3) -> recursie ls=() -> stopconditie bereikt first=3 rest=() first=2 rest=(4) first=1 rest=(3 4) (2 3 4)
> (func4 '(a b c)) A B C () > (trace func4) OK > (func4 '(a b c)) >>> Entering #<PROCEDURE FUNC4> Argument 1: (A B C) A >>> Entering #<PROCEDURE FUNC4> Argument 1: (B C) B >>> Entering #<PROCEDURE FUNC4> Argument 1: (C) C >>> Entering #<PROCEDURE FUNC4> Argument 1: () () > (untrace func4) OK > (func4 '(a b c)) A B C ()