この記事は、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の使いどころについて考察してみたいと思います。