Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
goodbye-python-repl
Search
Niyarin
July 19, 2020
Programming
0
340
goodbye-python-repl
Niyarin
July 19, 2020
Tweet
Share
More Decks by Niyarin
See All by Niyarin
Scheme用nREPLの開発(エラー出力の改善)
niyarin
0
140
bel lispの紹介
niyarin
0
710
nanopass-compiler-frameworkを使ってみました
niyarin
0
410
Gorgos-parser-combinator-written-in-scheme
niyarin
0
370
outputting-beautiful-s-expression
niyarin
0
360
Serialisp
niyarin
1
650
Mongo DBとS式検索
niyarin
0
290
SchemeのEphemeronとWeak Pairの説明
niyarin
0
970
red-paren-scheme-rev-macro.pdf
niyarin
0
400
Other Decks in Programming
See All in Programming
Being an ethical software engineer
xgouchet
PRO
0
210
KawaiiLT 登壇資料 キャリアとモチベーション
hiiragi
0
110
Coding Experience Cpp vs Csharp - meetup app osaka@9
harukasao
0
750
Ruby's Line Breaks
yui_knk
2
1.1k
サービスレベルを管理してアジャイルを加速しよう!! / slm-accelerate-agility
tomoyakitaura
1
180
エンジニアが挑む、限界までの越境
nealle
1
210
AI Coding Agent Enablement - エージェントを自走させよう
yukukotani
14
6.1k
AWSで雰囲気でつくる! VRChatの写真変換ピタゴラスイッチ
anatofuz
0
160
AIコーディングの理想と現実
tomohisa
22
29k
Optimizing JRuby 10
headius
0
320
ミリしらMCP勉強会
watany
4
760
リストビュー画面UX改善の振り返り
splcywolf
0
140
Featured
See All Featured
Why Our Code Smells
bkeepers
PRO
336
57k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
Site-Speed That Sticks
csswizardry
5
490
Automating Front-end Workflow
addyosmani
1369
200k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
9
750
Building Flexible Design Systems
yeseniaperezcruz
329
38k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
We Have a Design System, Now What?
morganepeng
52
7.5k
Code Review Best Practice
trishagee
67
18k
Transcript
goodbye-python-repl Niyarin
電卓代わりの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 * x fac (- 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→ list dict → (scheme hash) set →
(scheme set) tuple → vector or (scheme ilist) or (scheme rlist) bytearray → bytevector file → 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