crane

debug-print

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)))))))

memo

Gauche:FAQ に加えるにはあまりに細かすぎるような気がしたので、とりあえずここに書いてみます。既にどこかでまとまっている内容でしたらごめんなさい。いろいろ不正確です。

Q. Common Lisp の(素晴らしい|邪悪な) Loop マクロはないの?

A.  SRFI-42 があります。gauche なら (use srfi-42) としてすぐ使えます。 http://scheme.dk/blog/2006/08/eager-comprehensions-for-black-belts.html も。

Q. Scheme の format は機能が少ない?

A. gauche の format は拡張されています。 http://practical-scheme.net/gauche/man/gauche-refj_57.html 参照。

Q. リードマクロは無いの?

A. gauche および srfi で拡張されていますが、残念ながらカスタマイズはできないようです。 http://practical-scheme.net/gauche/man/gauche-refj_22.html 字句構造 参照。

 #` を使うと文字列リテラル内に式を埋め込めます。

http://practical-scheme.net/gauche/man/gauche-refj_48.html 参照。

Q. パッケージは本当にない?

A. パッケージは無いようですが、モジュールというものがあります。gauche 固有? http://practical-scheme.net/gauche/man/gauche-refj_10.html

Q. Common Lisp の(「伝統的な」)マクロはない?

A. gauche なら define-macro があります。ただし微妙に違うようです。

Q. disassemble はないの?

A. disasm があります。ただし「コンパイラのバグをなんとかしようという場合か、限界まで チューンしようとしないかぎりは役には立たないでしょう。」とのことです。

Q. とりあえず Emacs から使う場合は?

A. M-x run-scheme

Q. (Emacsで)S式のインデントがおかしい|好みに合わない

A. http://karetta.jp/book-node/gauche-hacks/004682 を参考にするとカスタマイズできます。

Q. どこまでが標準の手続きでどこから違うか分からない

A. http://practical-scheme.net/wiliki/schemexref.cgi を使うと調べられます。


こんにちは。関東在住のエンジニアです。

CLOS

勉強中

sort

heap

tree

 rio orange
More ...