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
400
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
goodbye-python-repl
Niyarin
July 19, 2020
More Decks by Niyarin
See All by Niyarin
Scheme用nREPLの開発(エラー出力の改善)
niyarin
0
190
bel lispの紹介
niyarin
0
800
nanopass-compiler-frameworkを使ってみました
niyarin
0
500
Gorgos-parser-combinator-written-in-scheme
niyarin
0
430
outputting-beautiful-s-expression
niyarin
0
430
Serialisp
niyarin
1
740
Mongo DBとS式検索
niyarin
0
360
SchemeのEphemeronとWeak Pairの説明
niyarin
0
1.1k
red-paren-scheme-rev-macro.pdf
niyarin
0
460
Other Decks in Programming
See All in Programming
信頼性の目標を誰も求めてない
shubox
0
480
【デモ】Kiroで体験する仕様駆動開発|設計からコーディングまでAIと進める開発フロー
cmkudo
0
560
私のClaude Code活用法 (個人開発編) - PHPerKaigi mini #4(2026/08/24)
panda_program
1
210
이 함수, 실패하면 어떻게 되나요? null부터 Rich Errors까지, Kotlin 에러 처리 15년
haeti2
0
120
業務時間外もAIに働いてもらう話
colorful12
3
9.9k
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
620
AIエージェント時代のコードレビューを設計する
nogu66
5
2.4k
Foundry Localでエージェント開発
seosoft
0
120
FDEとは、何者なのか?
masapyon1212
0
130
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
0
130
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
yimajo
0
350
iOS開発×AI駆動開発 〜最近使って便利だったスキルの話〜
nogu66
0
140
Featured
See All Featured
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.2k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
260
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
810
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.3k
Designing for humans not robots
tammielis
254
26k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Odyssey Design
rkendrick25
PRO
2
800
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