2012年7月8日日曜日

アプリケーションの実装(2)

はじめに

おはようございます。当ブログにアクセス頂き、ありがとうございます。
『臥薪嘗胆』が高校時代の座右の銘だった、たなけんです。
本エントリでは、アプリケーションの実装について記載いたします。

アプリケーションの実装(2)

本日は以下のコードを紹介します。
  • url構築関数
  • xml取得関数
  • JSON文字列出力関数
  • 意味検索メイン関数

url構築関数


引数に与えられた文字列をurlテンプレートに埋め込みます。
Dictionary.comは意味取得以外にもAPIを提供しているため、
柔軟にurlを構築出来るよう引数を設定しています。 
  • str関数: 引数を文字列として結合する

xml取得関数


引数のurlへhttpリクエストを送信し、レスポンスを受信します。
レスポンスのbody要素をxml文字列として取得します。

  • clj-http.client/get関数: 引数のurlにGETメソッドのhttpリクエストを送信

JSON文字列出力関数


xml文字列から、単語、品詞、意味を含むJSON文字列を生成します。

  • letfn特殊形式: スコープ内でのみ利用する関数を束縛
  • clj-xpath.core/$x: 第1引数のxpath問い合わせを、第2引数のxmlに対して実行する
  • let特殊形式: スコープ内でのみ利用する変数を束縛
  • for特殊形式: リスト内包表記
  • clj-json.core/generate-string: ClojureオブジェクトからJSON文字列を生成する

例えば下記のようなxmlから

下記のようなJSONを作成します。(改行、エスケープシーケンスは若干異なります)


追記: リスト内包表記について

例えば、(for [i '(1 2 3)] (+ 10 i))を評価すると、(11 12 13)が結果として返されます。
動作のイメージとしては、forの後の角括弧内のiにリストの各要素が束縛され、角括弧の後のS式を評価した結果のリストを返すといったものです。
1変数の場合は、map関数を用いても同様の結果を得ることが出来ます。
(map #(+ 10 %) '(1 2 3))

forの場合は複数の変数や、階層を持たせる(入れ子のfor文のイメージ)ことができます。
複数の変数を利用すると、Pythonのタプルのような、2要素のhashmapを簡単に作ることができます。

複数変数の例 (for [i '(:a :b :c) j '(1 2 3)] {i j})
結果 ({:a 1} {:a 2} {:a 3} {:b 1} {:b 2} {:b 3} {:c 1} {:c 2} {:c 3}) 

入れ子の例
(for [i '(:a :b :c)]
  (for [j '(1 2 3)] {i j})
)
結果

(
  ({:a 1} {:a 2} {:a 3})
  ({:b 1} {:b 2} {:b 3})
  ({:c 1} {:c 2} {:c 3})
)


今回の作業は以上。最後までお読み頂きありがとうございました。
たなけん (作業時間45分)

0 件のコメント:

コメントを投稿