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
380
goodbye-python-repl
Niyarin
July 19, 2020
Tweet
Share
More Decks by Niyarin
See All by Niyarin
Scheme用nREPLの開発(エラー出力の改善)
niyarin
0
160
bel lispの紹介
niyarin
0
770
nanopass-compiler-frameworkを使ってみました
niyarin
0
460
Gorgos-parser-combinator-written-in-scheme
niyarin
0
400
outputting-beautiful-s-expression
niyarin
0
410
Serialisp
niyarin
1
690
Mongo DBとS式検索
niyarin
0
340
SchemeのEphemeronとWeak Pairの説明
niyarin
0
1.1k
red-paren-scheme-rev-macro.pdf
niyarin
0
440
Other Decks in Programming
See All in Programming
[AI Engineering Summit Tokyo 2025] LLMは計画業務のゲームチェンジャーか? 最適化業務における活⽤の可能性と限界
terryu16
2
510
Honoを使ったリモートMCPサーバでAIツールとの連携を加速させる!
tosuri13
1
170
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
230
gunshi
kazupon
1
140
例外処理とどう使い分ける?Result型を使ったエラー設計 #burikaigi
kajitack
16
5.8k
余白を設計しフロントエンド開発を 加速させる
tsukuha
7
2k
SourceGeneratorのススメ
htkym
0
160
Claude Codeの「Compacting Conversation」を体感50%減! CLAUDE.md + 8 Skills で挑むコンテキスト管理術
kmurahama
1
810
ThorVG Viewer In VS Code
nors
0
750
AIフル活用時代だからこそ学んでおきたい働き方の心得
shinoyu
0
110
CSC307 Lecture 07
javiergs
PRO
0
520
ゆくKotlin くるRust
exoego
1
210
Featured
See All Featured
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
2
3.9k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
200
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
61
52k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
0
120
The Invisible Side of Design
smashingmag
302
51k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
910
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
1
1.4k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
110
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.3k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
120
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