2019年11月6日水曜日

fletってすげえ

 fletの使い所がいまいち、わからなかった。

 たとえば、dom.elを使ってhtml——tableを生成してみる。

(setq wrk (dom-node 'table nil
                    (dom-node 'tr
                              nil
                              (dom-node 'td
                                        nil
                                        "123"))))
(table nil (tr nil (td nil "123")))

(svg-print wrk)
<table> <tr> <td> 123</td></tr></table>nil

 こんな感じになるけど、なんか、わかりづらい。
 構造はhtmlと同じになっているけど、dom-nodeを呼び出しているせいで視認性が悪くなっている。htmlを書くようにコードを書けるのがいいんだろうけど……あれ、じゃ、fletでこうできるんじゃね?

(flet ((table (&optional attributes &rest children)
              (apply 'dom-node 'table attributes children))
       (tr (&optional attributes &rest children)
           (apply 'dom-node 'tbody attributes children))
       (td (&optional attributes &rest children)
           (apply 'dom-node 'tbody attributes children)))
  (table nil
         (tr nil
             (td nil "123"))))

(table nil (tbody nil (tbody nil "123")))

 ああ、そうか。
 fletの定義をマクロで隠蔽したらほとんど、htmlを書いているようになるんだ。
 なんだ、これ。
 すげえ。