http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3aデバッグ の議論がなかなか興味深いので、まだ#?!expr(debug-break)は存在しません(よね?)が、debug-print で似たようなことを書いてみたつもりです。こんなイメージであってますかね? scheme-mode の macroexpand がこんな方法(emacs 側でS式をちょっと加工して処理はscheme側)みたいです。AllegroCL の eli ではパッケージを考慮してくれますが、これは手抜きなので考慮していません。
scheme 編集中に領域を選択しておいて M-x gauche-send-region-debug と入力すると、run-scheme で起動した emacs のバッファに debug-print を適当に追加した定義を出力し eval します。 自分で書いておいてなんですがパターンマッチ程度で適当にdebug-printを付けるだけではあんまり嬉しくない、ということが分かりました :-) そしてGauche用のtrace/untraceマクロ(http://homepage.mac.com/skimu/ggc/) の方がはるかに便利な感じですね。 もちろん debug-break でブレークポイントが付けられると便利だと思います。
(use util.match) (define (add-debug-print sexp) (match sexp (('define (name formals) . body) `(define (,name ,formals) ,@(map add-debug-print body))) (('define name ('lambda formals . body)) `(define ,name (lambda ,formals ,@(map add-debug-print body)))) (('let ((var expr) ...) body ...) `(let ,(map (lambda (v e) `(,v ,e)) var expr) ,@(map add-debug-print body))) (('set! symbol expr) `(debug-print (set! ,symbol ,expr))) (('if test then else) `(if ,test (debug-print ,then) (debug-print ,else))) ((op exp ...) `(debug-print (,op ,@exp))) (_ sexp) ))
;; emacs ;; M-x gauche-send-region-debug ;; 修正 (defun gauche-send-region-debug (start end) (interactive "r") (comint-send-string (scheme-proc) "(eval (add-debug-print '") (comint-send-region (scheme-proc) start end) (comint-send-string (scheme-proc) ") (interaction-environment))") (comint-send-string (scheme-proc) "¥n"))
(define fib (lambda (n) (if (<= n 2) 1 (+ (fib (- n 1)) (fib (- n 2)))))) ;; 下のように変形 (define fib (lambda (n) (if (<= n 2) (debug-print 1) (debug-print (+ (fib (- n 1)) (fib (- n 2)))))))
Gauche:FAQ に加えるにはあまりに細かすぎるような気がしたので、とりあえずここに書いてみます。既にどこかでまとまっている内容でしたらごめんなさい。いろいろ不正確です。
A. SRFI-42 があります。gauche なら (use srfi-42) としてすぐ使えます。 http://scheme.dk/blog/2006/08/eager-comprehensions-for-black-belts.html も。
A. gauche の format は拡張されています。 http://practical-scheme.net/gauche/man/gauche-refj_57.html 参照。
A. gauche および srfi で拡張されていますが、残念ながらカスタマイズはできないようです。 http://practical-scheme.net/gauche/man/gauche-refj_22.html 字句構造 参照。
#` を使うと文字列リテラル内に式を埋め込めます。
http://practical-scheme.net/gauche/man/gauche-refj_48.html 参照。
A. パッケージは無いようですが、モジュールというものがあります。gauche 固有? http://practical-scheme.net/gauche/man/gauche-refj_10.html
A. gauche なら define-macro があります。ただし微妙に違うようです。
A. disasm があります。ただし「コンパイラのバグをなんとかしようという場合か、限界まで チューンしようとしないかぎりは役には立たないでしょう。」とのことです。
A. M-x run-scheme
A. http://karetta.jp/book-node/gauche-hacks/004682 を参考にするとカスタマイズできます。
A. http://practical-scheme.net/wiliki/schemexref.cgi を使うと調べられます。
こんにちは。関東在住のエンジニアです。
勉強中
rio orange