Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2011-02-22

適当な書き捨て仕事 2011/02/22

| 20:52 | 適当な書き捨て仕事 2011/02/22 - わだばLisperになる を含むブックマーク はてなブックマーク - 適当な書き捨て仕事 2011/02/22 - わだばLisperになる

ちゃちゃっとした仕事は、シェルだのPerlだのRubyだので済ませる人が多いかと思いますが、Common Lispでも道具を揃えておけばそれなりに色々できますし…

という日々の内容を思い付いたらだらだら書いたり書かなかったりして行きたいと思います。

以前にも

みたいなものを書いてみたりしてました。これからも似たような内容が多くなりそうです…。

最初に断わっておくと基本的に自分の場合は、#!スクリプトにするのではなく、SLIME上で式を実行するというスタイルがメインです。

REPLで結果を確認しつつ作成し、完成したら出力のストリームをファイルに向ける、という一行野郎を書くようなスタイルで書けたりするので割と効率が良いのではないでしょうか。

やりたいこと: CSVファイルのデータをHTMLとして仕立てなおす

(with-> "/tmp/foo.html"
  (letS* (((date pref sche)
           (Elist (fare-csv:read-csv-file "/var/tmp/foo.csv"))))
    (Rignore
     (format >
             "
  <div class=\"foo\">
    <div class=\"bar\">
      <h3>日 時</h3>
      <p>~A</p>
    </div>
    <div class=\"baz\">
      <h3>場 所</h3>
      <p>
~A
      </p>
    </div>
    <div class=\"quux\">
      <h3>内 容</h3>
      <p>
~A
      </p>
    </div>
  </div>
"
             (aprogn date
                     (ppcre:regex-replace "日" it "")
                     (ppcre:regex-replace "月" it "/")
                     (ppcre:regex-replace "^" it "2011/"))
             (ppcre:regex-replace-all
              "\\n"
              pref
              "<br />")
             (ppcre:regex-replace-all
              "\\n"
              sche
              "<br />")))))

カサカサカサっと2、3分もかからず書けると思います。HTMLは既存のものをコピペして穴を空けています。

道具

  • 正規表現
    • cl-ppcreです。Quicklispでインストールできます。(ql:quickload :cl-ppcre)
  • CSVファイルの読み込み
    • fare-csvを使います。Lisperに優しく結果がリストで返ってきます(ql:quickload :fare-csv)
  • with->
    • with-open-fileの出力専用バージョンで上書き(:if-exists :supersede)、かつストリームがボディ内で、>という変数名で参照できるという自作適当マクロです。
  • letS*、Rignore
    • 自分が良く使っているSeriesを扱うloopマクロみたいなものです。分配束縛ができます。古のマクロを自作で復活させて使ってるだけで完全なる趣味です。
  • aprogn
    • 入れ子を解消する自作のマクロです。
(aprogn date
        (ppcre:regex-replace "日" it "")
        (ppcre:regex-replace "月" it "/")
        (ppcre:regex-replace "^" it "2011/"))

(ppcre:regex-replace "^" (ppcre:regex-replace "月" (ppcre:regex-replace "日" date "") "/") "2011/")

みたいに展開されます。直前の式がitの部分に展開されます。

書いてる途中で、同じ関数が連続する場合は、

(aprogn date
        (ppcre:regex-replace "日" it "")
        (// "月" it "/")
        (// "^" it "2011/"))

みたいに書けたらナイスなんじゃないだろうか!などと思いましたが、横道に逸れると仕事が終わらないので自重しました。そもそもそんなに同じ関数が連続になることもないのであまり効果がなさそうです。