pythonの括弧包み

emacs pkg can not update

久しぶりにemacs内のパッケージをアップデートしようとしたら、下記のエラーが *Messages* に出て来て、拒否された。他のOSで試しても、日を変えて実行しても同様なエラー。

GNU Emacs 27.1 (build 1, i386-unknown-openbsd) of 2020-10-01
Waiting for refresh to finish...
error in process sentinel: Error retrieving: https://elpa.gnu.org/packages/arch\
ive-contents (error connection-failed "connect" :host "elpa.gnu.org" :service 4\
43) [2 times]

MELPAの Getting started の案内に従って、emacs内蔵のブラウザーewwで試すと応答無し。

(setq gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3")

ggしたら、こんな設定を書いておくといいよとの事。TLSの優先順位を調整するらしい。こんなの知らんがな。

Lisp with vi

前回OpenBSD好きな人が著したLOLって本を紐解いた。その付属にnvi使ってLispコードを編集してるもんねぇって、信じられない記述を見つけてしまった。で、ちょいとggしたら、

Using vi with Lisp

VimでのSchemeプログラミング

こんなのが引っかかってきた。リナが勢力を伸ばしているのでviと言っても、それはvimの事だ。注意して読まないとnviに適用出来ないからね。vimもpythonだか独自言語でパッケージを作り、機能を拡張出来るようになってる。

Emacs対vi

そして懐かしいmatzさんのエッセイも見つけてしまった。相変わらず日経Linuxでエッセイは続いているのかな? たまには立ち読みしてくるか。どうせ主要記事はpythonとラズパイだろうけどね。

で、vimの拡張で、S式のコピペに、y% とかが使えるって説明されてた(d% で消せる)。オイラーの持ってるvi本にそんな説明が有ったかなあ? すっかり忘れているので、紐解くのもよかろう。

まて、OpenBSDに向かい合ってるなら、ソースを読まんかい。manも有るしね。 取り合えず、/usr/src/usr.bin/vi/docsの中に有るhelpを参照す。

VI COMMANDS:
        ^A search forward for cursor word
        ^B scroll up by screens
        ^C interrupt an operation (e.g. read, write, search)
        ^D scroll down by half screens (setting count)
        ^E scroll down by lines
         :

こんなCtlキーを併用出来るんだ。知らんかったわい。ちょいと新しいコマンドを試してみようと思ったけど、勝手に指がemacs風に動いてしまって、どうにもならん。取り合えずnviもlispを扱えますよって、記憶に留めておこう。

ソースを読もう

matzさんのエッセイにソースコードを読もうってのが有った。ファイル名であたりを付けて、後はgrepでしこしこ見て行く。場合によってはetagを併用。

オイラーの得意技gdbは使わないのかなあ。昔懐かしい青木さんの、 ソースコードを読むための技術 なんかを見ると、動的解析って手法も説明されてるけど。新しい所では、 ソースコードを読むための技術(チートシート) こんなのも有った。

オイラーが心掛けているのは、まずREPLの場所を見つける事。次はwrite相当、read相当、最後はevalを見つけるってのかな。

matzさんはperlのコードを読もうとして難儀したらしい。マクロが多用されてて、grepでは追い切れない。関数の機能があちこちに分散してて、どうにもならない。

これって、前回オイラーが見てたghostscriptと一緒じゃん。先ほどもstackに載るデータはどうなってるって事で、どうにか iref.h にたどり着いたのはいいんだけど、普通なら説明が入っているメンバーのコメントがほどんど見当たらない。この分では、苦労する事が眼に見えているので、潔く撤退しよう。

大体postscriptが使えれば、それで十分ですから。。。

grid

取り合えず、遊ぶ為のグラフィック目盛り付き画面を用意してみた。

/ccryn  { 0.4  1.0  0.7 setrgbcolor } def
/cred   { 1.0  0.0  0.0 setrgbcolor } def
/cblack { 0.0  0.0  0.0 setrgbcolor } def
clippath pathbbox  /ury exch def  /urx exch def  pop pop
/hbar { 100 100 ury { /bw exch def
                      0 bw moveto  urx bw lineto stroke } for } def
/vbar { 100 100 urx { /bw exch def
                      bw 0 moveto  bw ury lineto stroke } for } def
/grid { ccryn hbar vbar cblack } def
/org { translate  cred                       %% ( x y org - )
       0 0 10 0 360 arc stroke  cblack } def
%!PS-Adobe-3.0 EPSF-3.0
% ex.  rlwrap gs -sPAPERSIZE=a2 sample.ps

(grid.ps) run
grid   300 300 org
showpage

目が荒いのはご容赦ください。細かい目盛り画面が必要なら姑息な方法だけど、コメントのように広い用紙を指定しれ。通常は原点が左下に有るんだけど、orgを使えば、原点を移動させて、原点に小さな赤〇を表示してくれる。

postscriptで関数定義する時は、最初に関数の雛型である /fn { } def を書いてしまい、それから { } 内を埋めるようにすると間違いを減らせる。慣れてくると描くのが楽しくなってくるぞ。

GS>/hoge 1234 def
GS>hoge =
1234
GS>/hoge { mul add = } def
GS>1 2 3 hoge
7

そうそう、関数定義が出てきたので一言。postscriptって、lisp-1 なんですね。

Forth and PostScript

hy

なにか検索してて、面白い物を見つけた。流行りのpythonを括弧で包んでlispみたいにしちゃいましょうと言う奴。pythonの、あの厳格なインデントを無視出来る優れもの。

だから、表題にpythonのパイ包み なんて書いちゃったけど、それって、クリームシチューのパイ包みみたいに美味しい物なの? じっくり味わってみるか。

さらばpython、ようこそhylang 結構、濃い

ゼロから始めるHy(hylang)

Why Hy? (master doc)

PythonベースのLisp方言、 Hyのすすめ

Pythonで書かれたイカしたLisp: Hy

install hy and run

sakae@pen:/tmp$ sudo pip3 install git+https://github.com/hylang/hy

インストールは上記のようにやればおk。ついでにemacsから使える hy-mode も入れておくと吉。使い方はいたって簡単。

sakae@pen:/tmp$ hy
hy 0.20.0+7.g1a0cde9a using CPython(default) 3.7.3 on Linux
=> (+ 1 2 3 4 5)
15
=> (cons 1 '())
Traceback (most recent call last):
  File "stdin-f7e311226944f83a5f1e1638be0fa56fcee9be5f", line 1, in <module>
    (cons 1 '())
NameError: name 'cons' is not defined
=> (quit)

consが無いって、そりゃ紛い物認定って、その通りなんだけど、折角入れたので少し付き合ってみる。

sakae@pen:/tmp$ cat /usr/local/bin/hy
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import re
import sys

from hy.cmdline import hy_main

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(hy_main())

普通のパッケージなんだな。

(defn fact [n]
  (if (= n 0)
    1 (do (import pdb) (pdb.set-trace))
    (* n (fact (- n 1)))))

面白いのはemacsから使った時。1の後ろにカーソルを持ってきておいて、C-c C-t すろと、御覧のようにpython用のデバッガーであるpdbの呼び出しコードが埋め込まれる。そして、おもむろに実行。

=> (fact 3)
fact(3)

> /tmp/stdin-7b526f9447e6e28767cdd12eb7e00bc104035f06(2)fact()
(Pdb) bt
  /usr/local/bin/hy(10)<module>()
-> sys.exit(hy_main())
  /usr/local/lib/python3.7/dist-packages/hy/cmdline.py(662)hy_main()
-> sys.exit(cmdline_handler("hy", sys.argv))
  /usr/local/lib/python3.7/dist-packages/hy/cmdline.py(655)cmdline_handler()
-> output_fn=options.get('repl_output_fn'))
  /usr/local/lib/python3.7/dist-packages/hy/cmdline.py(455)run_repl()
-> os=platform.system()
   :
-> self.runcode(code)
  /usr/local/lib/python3.7/dist-packages/hy/cmdline.py(327)runcode()
-> self.last_value = eval(code[1], self.locals)
  /tmp/stdin-9a9fdc08dc80e8b09cdaabb242d21fe116f85bc5(1)<module>()
> /tmp/stdin-7b526f9447e6e28767cdd12eb7e00bc104035f06(2)fact()
(Pdb) p n
3

pdbが鎌首をもたげてきた。後は煮るなり焼くなり、好きにしてください。

spy

上でpdbを忍び込ませたのはいいんだけど、contしたらおかしな事になった。一体全体どういう風にlisp語(もどき)をpython語に変換してるの? 作者さんは、自分用のdebugのお供を用意してた。んで、それに甘えてみる。

debian:tmp$ hy --spy
hy 0.20.0+5.g0ec70a2f using CPython(default) 3.8.3 on Linux
=> (defn fact [n]
...   (if (= n 0)
...     1
...     (* n (fact (- n 1)))))
def fact(n):
    return 1 if n == 0 else n * fact(n - 1)


None

–spy付きで起動してから、画面にコピペした。そしたら即座にpython語で応答が有った。そんじゃ、長い々電文の場合は? その対応もしっかりと準備されてる。

debian:tmp$ hy --spy -i fact.hy
def fact(n):
    return 1 if n == 0 else n * fact(n - 1)


None

hy 0.20.0+5.g0ec70a2f using CPython(default) 3.8.3 on Linux
=>

これで安泰だな。みんなこういう技は承知の上で、ごにょごにょやってるんだろうね。ggっても、余り出てこない裏技かな。

hyを触ってみる ちゃんと触った人の感想。

Pythonを使って関数型プログラミング Part.1 Hyに拘らなければ色々な道が有るとな。

gui by hy

Hy で GUI プログラミングをしてみる

本格的にGUIまでやってる人が居た。こういう風にlispで出来ると楽しいな。まて、お前にはghostscriptと言う、楽しい友も居るじゃないか。しっかり数学の勉強でもせいや。

etc

cocount Simple, elegant, Pythonic functional programming.

Gaucheクックブック


This year's Index

Home