goodbye-python-replNiyarin
View Slide
電卓代わりのPython REPL・S式ユーザでも電卓的に立ち上げているのはたまに見る・私もよくやる1
複雑なことは慣れたツールが良い・Pythonの関数は少し苦手末尾再帰されない (今は改善されたかもしれないが)3系のmapが残念 (一回イテレートが必要。電卓としては面倒)・letが欲しい「電卓部はPython(風?)で良いけど、それ以外はSchemeでやりたい」→ Py的なsyntax と S式との共存 or syntax 切り替え2
SRFIを使う? (SRFI 49)SRFI 49→ S式と共存できるインデントで構造を作るsyntaxの提供「インデントがいるような長い式はSchemeでやるので..それよりかは、中置記法が欲しい」define (fac x)if (= x 0)1* xfac (- x 1)3
SRFIを使う? (SRFI 105)SRFI 105→ {}内で中置記法とf(x)形式の記述ができるsyntaxの提供{n > 5} ;(> n 5){a + b + c} ;(+ a b c){cons(1 2)} ;(cons 1 2)4
SRFI 105は一見良さげだが.・SRFI 105は中間に置いた手続きをただ頭に置くだけ・演算子の混合は自力で評価する手続きor syntaxを書く必要がある(演算子の順序の解決もユーザーまかせ)→ $nfx$をユーザが定義する必要がある{1 cons 2} ;(cons 1 2){+(1 2)};(+ 1 2){1 + 2 * 3};($nfx$ 1 + 2 * 3)5
SRFI 105は一見良さげだが.・{}というprefixを書くのが電卓として面倒である・+-*/の間に空白が要求されているのも良くない(もちろんこれらはただの手続き(シンボル)なのでデリミタが必要){1 + 2}6
・REPLを交換可能なリーダーを作って実装する・当初はこの計画だった自前のPython風readerを作る?7(let loop ()(eval (switchable-read))(loop))通常のScheme reader(read手続き)Python風 Scheme reader何らかのトリガーで切り替える (例:特定のシンボルが打ち込まれた時 )
Hyってやつはどうなんだ?・S式→ Python ASTな言語・欲しいのはSchemeなので次点候補として・どうやってhyからreplを呼ぶのか分からなかった(できそうだけど)・あるいは read関数+eval関数か(同じ環境でevalできるかは不明)→ あとでしらべる。8
goodbye-python-repl (今回作ったもの)・python replからgoodbye-replするとGaucheに移動する9
やっていること・仕組み自体はとても簡単単純にオブジェクト変換して、中で立ち上げたGaucheに渡す・実際は、Gaucheの-eオプションにdefineで包んで渡している(電卓程度なので、簡単なものしか変換できないけど)Python object[1,2,3]Scheme object(1 2 3)['gosh', '-e', '(begin (import (scheme repl)(scheme base)(srfi 69))(define a `( 1 2 3)))']10
リテラルで表現できないものの扱い・ハッシュテーブル (scheme hash-table) or (srfi 69) or (srfi 125) の例quasiquoteでうまくリテラル部に挿入する・辞書in辞書やリストinリストでもうごく(はず)。[1 , {“a”:2,”b”:3}] `(1 ,(alist->hash-table `((“a” . b) (“b” . 3))))11
ちゃんと変換するなら(実装したのは、list,dict,string,int,float,boolとかぐらいだけど)list,range→ listdict → (scheme hash)set → (scheme set)tuple → vector or (scheme ilist) or (scheme rlist)bytearray → bytevectorfile → fileオブジェクト → record or (scheme hash)12
目を背けている場所・関数・最悪、pyバイトコード → Scheme すればできるが...・py関数オブジェクトを良さげなデシリアライズツールとかあるのかな?・ポインタの問題a = [1,2,3]b = aを変換するとScheme処理系によってはa,bは別の位置を指すことがある13
see-you-python-replもやろうと思えばできるgood-bye-python-replは行きっぱなしなので...・Scheme → Python object をやるだけもう少し工夫するなら、2度目のREPL突入時、1度目のREPLを落とさず、上書きする機構をつける→ 定義した 補助関数とか消えなくて済むそもそも中間式、S式を頻繁にスイッチするなら、リーダースイッチ方式にするべき(7Pのやつ)14
おしまい/感想・小ネタとして考えていただけなのでジョークツール程度の出来だった期待はできません・Scheme → python FFI ってどうなのかなオブジェクトの変換とかやっていて思っただけ15