準クォートの使いどころがやっと分かった

理屈は分かってたのだけれど使いどころがいまいちよく分からなかったのがやっと分かった。
やっぱり本だけじゃダメ。プログラムは頭で理屈を理解して体で使い方を覚えないといけない。


CGIを作っていてテキストの表示をまとめて行うときにこんな事をしていた。

(define show-text
  (html:p "あいうえお")
  (html:p "かきくけこ"
    (html:a :href "?arg=sample" "サンプル")
    "さしすせそ"))

html:pが連続していて見づらい。


そこで間に関数をつくってやって簡単にしてみる。
最初html-textを再帰で頑張っていたけど、mapに気づいた。mapは便利だ、素晴らしい。
再帰ってmapで結構書き換えれるのかも…。

(define (html-text . args)
	(map html:p args))

(define show-text
	(html-text
		'("あいうえお")
		("かきくけこ"
		 (html:a :href "?arg=sample" "サンプル")
		 "さしすせ")))

ところが (html:a :href "?type=sample" "サンプル") の行が評価されず、そのまま出力されるのに気づいた。


そこで準クォートを思い出した。

(define (html-text . args)
	(map html:p args))

(define show-text
	(html-text
		'("あいうえお")
		`("かきくけこ"
		 ,(html:a :href "?arg=sample" "サンプル")
		 "さしすせ")))

マクロが使えるかなと思ったけど、マクロについてはまだ使いどころが分からないのでパス。


追記
「On Lisp」を読み始めたけど、ソースってSchemeじゃなくてCommon Lispなのね。
まだ始めの方だから読めてるけど、Common Lispの基本を勉強してから読んだ方が良いのかな?
defunに慣れず気持ち悪い。