$30 off During Our Annual Pro Sale. View Details »

goodbye-python-repl

 goodbye-python-repl

Niyarin

July 19, 2020
Tweet

More Decks by Niyarin

Other Decks in Programming

Transcript

  1. goodbye-python-repl
    Niyarin

    View Slide

  2. 電卓代わりのPython REPL
    ・S式ユーザでも電卓的に立ち上げているのはたまに見る
    ・私もよくやる
    1

    View Slide

  3. 複雑なことは慣れたツールが良い
    ・Pythonの関数は少し苦手
    末尾再帰されない (今は改善されたかもしれないが)
    3系のmapが残念 (一回イテレートが必要。電卓としては面倒)
    ・letが欲しい
    「電卓部はPython(風?)で良いけど、それ以外はSchemeでやりたい」
    → Py的なsyntax と S式との共存 or syntax 切り替え
    2

    View Slide

  4. SRFIを使う? (SRFI 49)
    SRFI 49
    → S式と共存できるインデントで構造を作るsyntaxの提供
    「インデントがいるような長い式はSchemeでやるので..
    それよりかは、中置記法が欲しい」
    define (fac x)
    if (= x 0)
    1
    * x
    fac (- x 1)
    3

    View Slide

  5. 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

    View Slide

  6. 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

    View Slide

  7. SRFI 105は一見良さげだが.
    ・{}というprefixを書くのが電卓として面倒である
    ・+-*/の間に空白が要求されているのも良くない
    (もちろんこれらはただの手続き(シンボル)なのでデリミタが必要)
    {1 + 2}
    6

    View Slide

  8. ・REPLを交換可能なリーダーを作って実装する
    ・当初はこの計画だった
    自前のPython風readerを作る?
    7
    (let loop ()
    (eval (switchable-read))
    (loop))
    通常のScheme reader
    (read手続き)
    Python風 Scheme reader
    何らかのトリガーで切り替える (例:特定のシンボルが打ち込まれた時 )

    View Slide

  9. Hyってやつはどうなんだ?
    ・S式→ Python ASTな言語
    ・欲しいのはSchemeなので次点候補として
    ・どうやってhyからreplを呼ぶのか分からなかった(できそうだけど)
    ・あるいは read関数+eval関数か
    (同じ環境でevalできるかは不明)
    → あとでしらべる。
    8

    View Slide

  10. goodbye-python-repl (今回作ったもの)
    ・python replからgoodbye-replするとGaucheに移動する
    9

    View Slide

  11. やっていること
    ・仕組み自体はとても簡単
    単純にオブジェクト変換して、中で立ち上げた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

    View Slide

  12. リテラルで表現できないものの扱い
    ・ハッシュテーブル (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

    View Slide

  13. ちゃんと変換するなら
    (実装したのは、list,dict,string,int,float,boolとかぐらいだけど)
    list,range→ list
    dict → (scheme hash)
    set → (scheme set)
    tuple → vector or (scheme ilist) or (scheme rlist)
    bytearray → bytevector
    file → file
    オブジェクト → record or (scheme hash)
    12

    View Slide

  14. 目を背けている場所
    ・関数
    ・最悪、pyバイトコード → Scheme すればできるが...
    ・py関数オブジェクトを良さげなデシリアライズツールとかあるのかな?
    ・ポインタの問題
    a = [1,2,3]
    b = a
    を変換するとScheme処理系によってはa,bは別の位置を指すことがある
    13

    View Slide

  15. see-you-python-replもやろうと思えばできる
    good-bye-python-replは行きっぱなしなので...
    ・Scheme → Python object をやるだけ
    もう少し工夫するなら、
    2度目のREPL突入時、1度目のREPLを落とさず、上書きする機構をつける
    → 定義した 補助関数とか消えなくて済む
    そもそも中間式、S式を頻繁にスイッチするなら、リーダースイッチ方式にするべき
    (7Pのやつ)
    14

    View Slide

  16. おしまい/感想
    ・小ネタとして考えていただけなのでジョークツール程度の出来だった
    期待はできません
    ・Scheme → python FFI ってどうなのかな
    オブジェクトの変換とかやっていて思っただけ
    15

    View Slide