Gaucheの #?= 相当のデバッグユーティリティをサポート
私がRubyで書いているLisp方言、 [Nendo]について。
Gaucheには #?=S式 という形式のリーダマクロでデバッグ表示する機能がある。 それを[Nendo]でもそっくりそのまま真似てみることにした。 結果を見て頂けるとわかるように、本当にソックリな表示になっているのがわかるだろう。 これで、手がGaucheに慣れてしまっている人でも[Nendo]で遊びやすくなったかな? 近日中にそこそこ遊べるバージョンとして 0.2.0 をリリースするので、粘土遊びを試してみてください。
- goshの実行例 (リファレンスマニュアルより抜粋) 今のところ、作者は必要な時は古典的な「プリントスタブ」方式を使っていま す。そのためのリーダーマクロ #?=expr が定義されています。これは (debug-print expr) のように読まれ、マクロ debug-print はexprを評価して その値を返しますが、評価前と評価後にメッセージを出力します。
gosh> #?=(+ 2 3)
#?="(stdin)":1:(+ 2 3)
#?- 5
5
gosh> #?=(begin (print "foo") (values 'a 'b 'c))
#?="(stdin)":2:(begin (print "foo") (values 'a 'b 'c))
foo
#?- a
#?+ b
#?+ c
a
b
c
gosh> (define (fact n)
(if (zero? n)
1
(* n #?=(fact (- n 1)))))
fact
gosh> (fact 5)
#?="(stdin)":6:(fact (- n 1))
#?="(stdin)":6:(fact (- n 1))
#?="(stdin)":6:(fact (- n 1))
#?="(stdin)":6:(fact (- n 1))
#?="(stdin)":6:(fact (- n 1))
#?- 1
#?- 1
#?- 2
#?- 6
#?- 24
120
- Nendoの実行例 (プログラムをファイルに保存してから実行) – ソース fact.nnd ```lisp #!/bin/sh true; #-- mode: nendo; syntax: scheme --;; true; exec /usr/local/bin/nendo $0 $*
;; fact (define (fact n) (if (zero? n) 1 (* n #?=(fact (- n 1)))))
(print (fact 5))
-- 実行結果
bash$ ./fact.nnd ./fact.nnd #?=”./fact.nnd”:9:(fact (- n 1)) #?=”./fact.nnd”:9:(fact (- n 1)) #?=”./fact.nnd”:9:(fact (- n 1)) #?=”./fact.nnd”:9:(fact (- n 1)) #?=”./fact.nnd”:9:(fact (- n 1)) #?- 1 #?- 1 #?- 2 #?- 6 #?- 24 120 ```