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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Niyarin
July 19, 2020
Programming
0
390
goodbye-python-repl
Niyarin
July 19, 2020
Tweet
Share
More Decks by Niyarin
See All by Niyarin
Scheme用nREPLの開発(エラー出力の改善)
niyarin
0
170
bel lispの紹介
niyarin
0
780
nanopass-compiler-frameworkを使ってみました
niyarin
0
460
Gorgos-parser-combinator-written-in-scheme
niyarin
0
410
outputting-beautiful-s-expression
niyarin
0
410
Serialisp
niyarin
1
700
Mongo DBとS式検索
niyarin
0
350
SchemeのEphemeronとWeak Pairの説明
niyarin
0
1.1k
red-paren-scheme-rev-macro.pdf
niyarin
0
450
Other Decks in Programming
See All in Programming
GC言語のWasm化とComponent Modelサポートの実践と課題 - Scalaの場合
tanishiking
0
110
new(1.26) ← これすき / kamakura.go #8
utgwkk
0
2.3k
CSC307 Lecture 15
javiergs
PRO
0
240
PostgreSQL を使った快適な go test 環境を求めて
otakakot
0
550
猫の手も借りたい!ので AIエージェント猫を作って社内に放した話 Claude Code × Container Lambda の Slack Bot "DevNeko"
naramomi7
0
260
AHC061解説
shun_pi
0
380
ポーリング処理廃止によるイベント駆動アーキテクチャへの移行
seitarof
3
1.1k
米国のサイバーセキュリティタイムラインと見る Goの暗号パッケージの進化
tomtwinkle
2
580
LangChain4jとは一味違うLangChain4j-CDI
kazumura
1
180
CDIの誤解しがちな仕様とその対処TIPS
futokiyo
0
220
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
300
Go Conference mini in Sendai 2026 : Goに新機能を提案し実装されるまでのフロー徹底解説
yamatoya
0
590
Featured
See All Featured
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
64
53k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
140
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
990
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.9k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
83
RailsConf 2023
tenderlove
30
1.4k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
3.7k
Discover your Explorer Soul
emna__ayadi
2
1.1k
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.4k
The agentic SEO stack - context over prompts
schlessera
0
690
エンジニアに許された特別な時間の終わり
watany
106
240k
How GitHub (no longer) Works
holman
316
140k
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