Greetings all.

If you have not been keeping track of the changes in bzr, you need to get the newest version and give some feedback (please!).

Ikarus now has a "-d" or "--debug" flag that starts ikarus in debug mode. This enables logging of (almost) all procedure calls and keeps a number of the last (fixed) number of procedure calls (in both tail and nontail positions). A few examples are given below. Note that - d causes a major slowdown in execution speed unfortunately. Libraries to which you have high confidence (e.g., SRFIs, etc.) should probably be precompiled with debugging mode disabled so that you can debug your own code and not code from these libraries.

Enjoy.

Aziz,,,


=====================================================================
$ cat /tmp/div-by-zero.ss

(import (rnrs))

(display
  (map
    (lambda (x)
      (map
        (lambda (y)
          (/ x y))
        '(1 2 0 3)))
    '(1 2 0 3)))

$ ikarus -d --r6rs-script /tmp/div-by-zero.ss
Condition trapped by debugger.
 Condition components:
   1. &assertion
   2. &who: /
   3. &message: "division by 0"
   4. &irritants: ()
[t] Trace. [r] Reraise condition. [c] Continue. [q] Quit. [?] Help.
> t
CALL FRAMES:
FRAME 0:
[0] (map (lambda (x) (map (lambda (y) (/ x y)) '(1 2 0 3))) '(1 2 0 3))
     source: char 30 of /tmp/div-by-zero.ss
     operator: #<procedure map>
operands: (#<procedure [char 39 of /tmp/div-by-zero.ss]> (1 2 0 3))
FRAME 1:
 [0] (map (lambda (y) (/ x y)) '(1 2 0 3))
     source: char 57 of /tmp/div-by-zero.ss
     operator: #<procedure map>
operands: (#<procedure [char 71 of /tmp/div-by-zero.ss]> (1 2 0 3))
FRAME 2:
 [0] (/ x y)
     source: char 93 of /tmp/div-by-zero.ss
     operator: #<procedure />
     operands: (1 0)
>

=====================================================================
$ ikarus -d
Ikarus Scheme version 0.0.4-rc1+ (revision 1791, build 2009-05-24)
Copyright (c) 2006-2009 Abdulaziz Ghuloum

> (let loop ([i 0]) (loop (+ i 1))) ;;; pressing ^C
^CCondition trapped by debugger.
 Condition components:
   1. &interrupted
   2. &message: "received an interrupt signal"
[t] Trace. [r] Reraise condition. [c] Continue. [q] Quit. [?] Help.
>> t
CALL FRAMES:
FRAME 0:
 [10915306] (loop (+ i 1))
     operator: #<procedure loop>
     operands: (10915306)
 [10915307] (loop (+ i 1))
     operator: #<procedure loop>
     operands: (10915307)
 [10915308] (loop (+ i 1))
     operator: #<procedure loop>
     operands: (10915308)
 [10915309] (loop (+ i 1))
     operator: #<procedure loop>
     operands: (10915309)
 [10915310] (loop (+ i 1))
     operator: #<procedure loop>
     operands: (10915310)
 [10915311] (loop (+ i 1))
     operator: #<procedure loop>
     operands: (10915311)
 [10915312] (loop (+ i 1))
     operator: #<procedure loop>
     operands: (10915312)
 [10915313] (loop (+ i 1))
     operator: #<procedure loop>
     operands: (10915313)
>>

=====================================================================
$ cat /tmp/tailcalls.ss
#!r6rs
(import (rnrs))
(let loop ([n 1000]) (if (zero? n) #f (begin (/ 1 (- n 12)) (loop (- n
1)))))

$ ikarus -d --r6rs-script /tmp/tailcalls.ss
Condition trapped by debugger.
 Condition components:
   1. &assertion
   2. &who: /
   3. &message: "division by 0"
   4. &irritants: ()
[t] Trace. [r] Reraise condition. [c] Continue. [q] Quit. [?] Help.
> t
CALL FRAMES:
FRAME 0:
 [981] (loop (- n 1))
     source: char 85 of /tmp/tailcalls.ss
     operator: #<procedure loop>
     operands: (19)
 [982] (loop (- n 1))
     source: char 85 of /tmp/tailcalls.ss
     operator: #<procedure loop>
     operands: (18)
 [983] (loop (- n 1))
     source: char 85 of /tmp/tailcalls.ss
     operator: #<procedure loop>
     operands: (17)
 [984] (loop (- n 1))
     source: char 85 of /tmp/tailcalls.ss
     operator: #<procedure loop>
     operands: (16)
 [985] (loop (- n 1))
     source: char 85 of /tmp/tailcalls.ss
     operator: #<procedure loop>
     operands: (15)
 [986] (loop (- n 1))
     source: char 85 of /tmp/tailcalls.ss
     operator: #<procedure loop>
     operands: (14)
 [987] (loop (- n 1))
     source: char 85 of /tmp/tailcalls.ss
     operator: #<procedure loop>
     operands: (13)
 [988] (loop (- n 1))
     source: char 85 of /tmp/tailcalls.ss
     operator: #<procedure loop>
     operands: (12)
FRAME 1:
 [0] (/ 1 (- n 12))
     source: char 70 of /tmp/tailcalls.ss
     operator: #<procedure />
     operands: (1 0)
>

=====================================================================
$ cat /tmp/ack.ss
(import (rnrs))

(define (ack m n)
   (cond ((= m 0) (/ 1 0))  ; deliberate error
         ((= n 0) (ack (- m 1) 1))
         (else (ack (- m 1) (ack m (- n 1))))))

(display (ack 2 2))
(newline)

$ ikarus -d --r6rs-script /tmp/ack.ss
Condition trapped by debugger.
 Condition components:
   1. &assertion
   2. &who: /
   3. &message: "division by 0"
   4. &irritants: ()
[t] Trace. [r] Reraise condition. [c] Continue. [q] Quit. [?] Help.
> t
CALL FRAMES:
FRAME 0:
 [0] (ack 2 2)
     source: char 176 of /tmp/ack.ss
     operator: #<procedure ack [char 27 of /tmp/ack.ss]>
     operands: (2 2)
FRAME 1:
 [0] (ack m (- n 1))
     source: char 146 of /tmp/ack.ss
     operator: #<procedure ack [char 27 of /tmp/ack.ss]>
     operands: (2 1)
FRAME 2:
 [0] (ack m (- n 1))
     source: char 146 of /tmp/ack.ss
     operator: #<procedure ack [char 27 of /tmp/ack.ss]>
     operands: (2 0)
 [1] (ack (- m 1) 1)
     source: char 101 of /tmp/ack.ss
     operator: #<procedure ack [char 27 of /tmp/ack.ss]>
     operands: (1 1)
FRAME 3:
 [0] (ack m (- n 1))
     source: char 146 of /tmp/ack.ss
     operator: #<procedure ack [char 27 of /tmp/ack.ss]>
     operands: (1 0)
 [1] (ack (- m 1) 1)
     source: char 101 of /tmp/ack.ss
     operator: #<procedure ack [char 27 of /tmp/ack.ss]>
     operands: (0 1)
 [2] (/ 1 0)
     source: char 54 of /tmp/ack.ss
     operator: #<procedure />
     operands: (1 0)
>


Reply via email to