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 を使うと調べられます。
こんにちは。関東在住のエンジニアです。
- データベース好きです。エディタは Emacs 派。
- 最近は仕事で Common Lisp 使ってます。
- システム管理ができ、お客さんと話をし、データベースが使え、プログラムも書ける何でも屋を目指してます。
CLOS
勉強中
sort
heap
tree
rio orange