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
390
0
Share
goodbye-python-repl
Niyarin
July 19, 2020
More Decks by Niyarin
See All by Niyarin
Scheme用nREPLの開発(エラー出力の改善)
niyarin
0
170
bel lispの紹介
niyarin
0
780
nanopass-compiler-frameworkを使ってみました
niyarin
0
470
Gorgos-parser-combinator-written-in-scheme
niyarin
0
410
outputting-beautiful-s-expression
niyarin
0
410
Serialisp
niyarin
1
710
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
Cyrius ーLinux非依存にコンテナをネイティブ実行する専用OSー
n4mlz
0
270
脱 雰囲気実装!AgentCoreを良い感じにWEBアプリケーションに組み込むために
takuyay0ne
3
420
PHPのバージョンアップ時にも役立ったAST(2026年版)
matsuo_atsushi
0
280
forteeの改修から振り返るPHPerKaigi 2026
muno92
PRO
3
110
Mastering Event Sourcing: Your Parents Holidayed in Yugoslavia
super_marek
0
130
RailsのValidatesをSwift Macrosで再現してみた
hokuron
0
150
GoのDB アクセスにおける 「型安全」と「柔軟性」の両立 - Bob という選択肢
tak848
0
300
AIと共にエンジニアとPMの “二刀流”を実現する
naruogram
0
110
「速くなった気がする」をデータで疑う
senleaf24
0
120
Feature Toggle は捨てやすく使おう
gennei
0
400
Reactive ❤️ Loom: A Forbidden Love Story
franz1981
2
210
Xdebug と IDE による デバッグ実行の仕組みを見る / Exploring-How-Debugging-Works-with-Xdebug-and-an-IDE
shin1x1
0
290
Featured
See All Featured
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
160
Information Architects: The Missing Link in Design Systems
soysaucechin
0
850
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
3.8k
My Coaching Mixtape
mlcsv
0
91
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
170
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
870
Scaling GitHub
holman
464
140k
KATA
mclloyd
PRO
35
15k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
260
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.2k
Facilitating Awesome Meetings
lara
57
6.8k
Making the Leap to Tech Lead
cromwellryan
135
9.8k
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