2016-07-14 19 views
3

Mit Emacs/Geiser mit Racket (nicht DrRacket), wie könnte ich einen Haltepunkt setzen und dann den Code durchlaufen, Haltepunkt (e) anhalten? Zum Beispiel habe ich diesen Code bekam:Haltepunkt in Racket setzen?

(define (powerset4 lst) 
    (if (null? lst) 
     '(()) 
     (append-map (lambda (x) 
        (begin 
         (fprintf (current-output-port) "~s ~s ~s\n" x lst x) 
         (list x (cons (car lst) x)))) 
        (powerset4 (cdr lst))))) 

und ich möchte in der begin Sequenz stoppen, um zu sehen, was passiert und was die Werte sind. Es wäre auch nett, sich nicht auf ye 'printf Tricks zu verlassen, d. H., Bestimmte Parameter auch zu verfolgen. Ich bin wieder in Emacs und benutze Geiser. Eigentlich würde ich zu Guile oder Chicken (Geiser Sprachen) wechseln, wenn ich das besser mit ihnen machen könnte.

+2

Das Setzen von Breakpoints, Stepping usw. ist Funktionalität, die normalerweise einem Debugger oder einer IDE und nicht einer Sprache zugeordnet ist. Für '#langracket' ist der Standard-Debugger in DrRacket integriert. Ther ist ein 'debug' Modul [https://docs.racket-lang.org/debug/index.html?q=debug#%28mod-path._debug%29] und eine unstable Bibliothek [https: // docs. racket-lang.org/unstable/Debugging.html?q=debug#%28form._%28%28lib._unstable%2Fdebug..rkt%29._debug%29%29], das als Teil eines Racket-Sprachprogramms verwendet werden kann. Diese sind möglicherweise besser zu managen als "Drucken". –

+0

@ 147pm Verwenden Sie den grafischen Debugger in DrRacket, um Haltepunkte zu erhalten. http://docs.racket-lang.org/drracket/debugger.html – soegaard

+0

Die Frage speziell für nicht DrRacket gefragt. –

Antwort

1

Als @ben Rudern erwähnt, gibt es eine debug Sprache (und Bibliothek), die ziemlich gut für das, was Sie wollen, funktioniert. Ich habe die andere Debugging-Bibliothek nicht verwendet, da die Warnung "instabil" etwas abstößt.

Hier ist eine Probe test.rkt Datei aus Ihrem Programm angepasst:

#lang racket 

(require debug/repl) 

(define (powerset4 lst) 
    (if (null? lst) 
     '(()) 
     (append-map (lambda (x) 
        (begin 
         (list x (cons (car lst) x)) 
         (debug-repl) ;; this is the breakpoint that will enter a REPL 
        )) 
        (powerset4 (cdr lst))))) 

(powerset4 '(1 2 3)) 

Wenn ich C-c C-a tun, um die Datei in Geiser zu laden, ich bin mit einem REPL begrüßt, das zeigt, dass ich den Debugger eingegeben haben. Dann kann ich die Werte im aktuellen Umfang überprüfen und sehen, was vor sich geht.

Welcome to Racket v6.6. 
[email protected]> ,enter "/Users/my_username/test.rkt" 
[email protected]> x 
'() 
[email protected]> lst 
'(3) 
[email protected]> 

Merkwürdigerweise (für mich zumindest), wenn Geiser zu auto-complete versucht, die lst Variable, die REPL gehängt und das Töten der racket Prozess des REPL verursacht Emacs als auch hängen. Ich bin mir nicht ganz sicher, worum es dabei ging, aber davon abgesehen scheint das gut zu funktionieren.