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すると、ココナッツオイルで若返りとかが、やたらにヒット。数年前に女房がはまって、毎朝パンに塗りたくっていたな。効果の程は??? ってのは、言うまでもない。フードマフィアの陰謀です。

Pythonで始めてみよう関数型プログラミング

Coconutことはじめ

こんなのが出て来るけど、単なる紹介記事だ。オイラーもそんなレベルだな。

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とか。

PythonとLispの関係について

((Pythonで) 書く (Lisp) インタプリタ)

((Rubyで) 書く (Lisp) インタプリタ)

Lisp プログラマのための Python 入門

楽しい読み物を挙げてみた。


This year's Index

Home