• 16
    いいね
  • 1
    コメント
この記事は最終更新日から1年以上が経過しています。

この記事は、Lispっぽいけど一応Python その2 Advent Calendar 2015の2日目の記事です。

Hyとは?

HyとはPythonで実装されたLispインタプリタです。

プログラミングのすべての道はLispに至るので、その途中のステップとしてHyに入門してみます。

インストール

pipで簡単にインストールできます。

pip install hy

起動してみました。

% hy
hy 0.11.0 using CPython(default) 2.7.6 on Linux
=> (print "Hello, World")
Hello, World

Pythonモジュールを呼び出す

まず気になるのはPython標準モジュールや、Pythonの定番ライブラリを呼び出すにはどうすればよいかということなので、試してみます。

datetime.datetimeオブジェクトを取得。

=> (import datetime)
=> (datetime.datetime.now)
datetime.datetime(2015, 12, 2, 3, 25, 37, 20456)

reで正規表現マッチ。

=> (re.findall r"([a-zA-Z]+)" "Spam Egg Ham")
[u'Spam', u'Egg', u'Ham']
=> (.groups (re.match r"([a-zA-Z]+)" "Spam Egg Ham"))
(u'Spam',)

requestsでHTTPリクエストを送る。事前にpip install requestsする必要があります。

=> (import requests)
=> (requests.get "https://ticketcamp.net/")
<Response [200]>

Lispの構文に慣れていれば、ごく普通に使えますね。

関数を定義する

defnを使います。

=> (defn plus2 [x] (+ 2 x))
=> (plus2 1)
3L

map, filter

よくLispの入門書で使われているinc, odd?, even?については事前に定義されていました。これらを使って、map, filterを試してみます。

まずはmap

=> (map inc [1 2 3])
<itertools.imap object at 0x7fb7b0193f50>
=> (list (map inc [1 2 3]))
[2L, 3L, 4L]

次にfilter

=> (filter odd? [1 2 3])
<itertools.ifilter object at 0x7fb7b13f59d0>
=> (list (filter odd? [1 2 3]))
[1L, 3L]

->>マクロも使えそうだったので、ClojureのTransducersの例にある処理を試してみます。

=> (def coll [1 2 3])
=> (->> coll (filter odd?) (map inc) (take 1))
<itertools.islice object at 0x7fb7b0199cb0>
=> (list (->> coll (filter odd?) (map inc) (take 1)))
[2L]

dict

Pythonのdictに相当するオブジェクト。(Lispでなんて言うんだっけ?)

=> (def data {:spam 1 :egg 2 :ham 3})
=> (:spam data)
1L

最後に

いろいろ試してみて、最近個人的によく触っているClojureとおなじ感覚で触れるなという印象を持ちました。が、すべてのプログラミングはLispに至るとはいえ、これを使って何かを作るというところまで想像が及びません。

次回はHyの使いどころについて考察してみたいと思います。

この投稿は Python その2 Advent Calendar 20152日目の記事です。