coconut
coconut
前回眼を付けておいた、pythonに皮を被せるやつ。
debian:~$ coconut Coconut Interpreter: (type 'exit()' or press Ctrl-D to end) >>> "hello, world!" |> print hello, world!
パイプが使えるとな。
>>> def factorial(n):
"""Compute n! where n is an integer >= 0."""
if n `isinstance` int and n >= 0:
acc = 1
for x in range(1, n+1):
acc *= x
return acc
else:
raise TypeError("the argument to factorial must be an integer >= 0")
>>> 0 |> factorial |> print
1
>>> 3 |> factorial |> print
6
>>> -1 |> factorial |> print
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "<string>", line 9, in factorial
TypeError: the argument to factorial must be an integer >= 0
自作の関数でも、パイプおk。
>>> def add(n, m) = n + m def square(n) = n * n >>> (square..add)(3, 1) 16
haskell風に関数を定義しておいて、それを合成してみるとな。
>>> add = (x, y) -> x + y add1 = add$(1) >>> add1(5) 6
こういう風に、部分適用も出来るとな。 -> が、あれとそっくりさんだな。lambda君。
>>> c = a + b where:
a = 1
b = 2
>>> c
3
益々、haskellっぽい。でも正体は?
14096 pts/2 S+ 0:02 /usr/local/bin/python3.8 /usr/local/bin/coconut
依然としてpythonです。前回のhy風起動スクリプト。なるべくpythonの雰囲気を消してる。
debian:~$ cat /usr/local/bin/coconut
#!/usr/local/bin/python3.8
# -*- coding: utf-8 -*-
import re
import sys
from coconut.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())
coconut 使い方
こんなワードでggすると、ココナッツオイルで若返りとかが、やたらにヒット。数年前に女房がはまって、毎朝パンに塗りたくっていたな。効果の程は??? ってのは、言うまでもない。フードマフィアの陰謀です。
こんなのが出て来るけど、単なる紹介記事だ。オイラーもそんなレベルだな。
replから使うと、勝手に色付けされて不便この上ない。有名な奴ならemacsに有るはず。有るには有ったんだけど、
("|>" . font-lock-doc-face)
("|\*>" . font-lock-doc-face)
("<\*|" . font-lock-doc-face)
こんな具合に、font-lockが設定されてるだけで、全く実用にならず。無理して使うより、python-mode で使う事を推奨。
サフィックスは、.coco らしい。
ob$ cat test.coco
add = (x,y) -> x + y
add5 = add$(5)
14 |> add5 |> print
ob$ coconut test.coco
Compiling test.coco ...
Compiled to test.py .
ob$ wc test.*
3 15 57 test.coco
778 3337 38293 test.py
簡単なコードをファイルに書いてから、coconutに喰わせてみた。py語へコンパイルするんですね。そして太ったやつが出来上がった。
ob$ python3.8 test.py 19
勿論、pythonから実行出来る。
ob$ cat test.py
:
# Compiled Coconut: -----------------------------------------------------------
add = lambda x, y: x + y
add5 = _coconut.functools.partial(add, 5)
(print)((add5)(14))
長い々、前ぶりが続いて、オイラーが書いたコードは、普通のpythonが実行出来るコードに変換されてた。
ob$ coconut -r test.coco Compiling test.coco ... Compiled to test.py . 19 ob$ coconut -r test.coco -i CoconutWarning: extraneous --run argument passed; --interact implies --run Left unchanged test.py (pass --force to override). 19 Coconut Interpreter: (type 'exit()' or press Ctrl-D to end) >>> add5(123) 128
上記のように、コンパイルしてから実行させたい場合、-rを付ければよい。そのままreplに居座りたい場合、更に -iを重ねればよい。
このコンパイル作業には、
ob$ ls -lh /usr/local/lib/python3.8/site-packages/*.so -rwxr-xr-x 1 root wheel 11.2M Feb 14 10:19 /usr/local/lib/python3.8/site-packages/cPyparsing.so*
こんな大きなsoファイルが使われている。pip3でインストール時に、ccが起動して随分と時間を費やしていた。一瞬ハングしたかと思ったぞ。
data
haskellでは、必需品のdataも有るぞ。
>>> data vector2(x:int=0, y:int=0):
def __abs__(self):
return (self.x**2 + self.y**2)**.5
v = vector2(3, 4)
v |> print
vector2(x=3, y=4)
>>> v |> abs |> print
5.0
こういうのは有り難いんだけど、既存のパッケージと組み合わせようとすると(例えばnumpy)途端に立ち往生してしまう。
coconutを使ったアプリを探しても、全く見つからない。誰も実用にしてないって事か。
python and lisp
兎角、隣の芝生は青い、症候群にかかってしまったpython好きな人達が居るな。前回取り上げた hy、今回のcoconut。他にぱっと思い付く所では、sympyとか。
楽しい読み物を挙げてみた。