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したら、
こんなのが引っかかってきた。リナが勢力を伸ばしているのでviと言っても、それはvimの事だ。注意して読まないとnviに適用出来ないからね。vimもpythonだか独自言語でパッケージを作り、機能を拡張出来るようになってる。
そして懐かしい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 なんですね。
hy
なにか検索してて、面白い物を見つけた。流行りのpythonを括弧で包んでlispみたいにしちゃいましょうと言う奴。pythonの、あの厳格なインデントを無視出来る優れもの。
だから、表題にpythonのパイ包み なんて書いちゃったけど、それって、クリームシチューのパイ包みみたいに美味しい物なの? じっくり味わってみるか。
さらばpython、ようこそhylang 結構、濃い
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
本格的にGUIまでやってる人が居た。こういう風にlispで出来ると楽しいな。まて、お前にはghostscriptと言う、楽しい友も居るじゃないか。しっかり数学の勉強でもせいや。