kiyokaのブログアーカイブ

Archive of old blog posts

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