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とか。
楽しい読み物を挙げてみた。