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
SchemeのEphemeronとWeak Pairの説明
Search
Niyarin
June 25, 2020
Programming
1.1k
0
Share
SchemeのEphemeronとWeak Pairの説明
Niyarin
June 25, 2020
More Decks by Niyarin
See All by Niyarin
Scheme用nREPLの開発(エラー出力の改善)
niyarin
0
180
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
720
Mongo DBとS式検索
niyarin
0
360
goodbye-python-repl
niyarin
0
390
red-paren-scheme-rev-macro.pdf
niyarin
0
450
Other Decks in Programming
See All in Programming
PHPでバイナリをパースして理解するASN.1
muno92
PRO
0
180
Programming with a DJ Controller — not vibe coding
m_seki
3
680
「話せることがない」を乗り越える 〜日常業務から登壇テーマをつくる思考法〜
shoheimitani
4
920
2026-04-15 Spring IO - I Can See Clearly Now
jonatan_ivanov
1
150
JOAI2026 1st solution - heron0519 -
heron0519
0
160
Swift Concurrency Type System
inamiy
1
560
Back to the roots of date
jinroq
0
590
PCOVから学ぶコードカバレッジ #phpcon_odawara
o0h
PRO
0
290
個人的に嬉しかったpnpmの新機能・3選
matsuo_atsushi
0
110
Firefoxにコントリビューションして得られた学び
ken7253
2
140
Symfony AI in Action - SymfonyLive Berlin 2026
chr_hertel
1
100
いつか誰かが、と思っていた フロントエンド刷新5年間の実践知
kiichisugihara
1
210
Featured
See All Featured
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
240
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
0
220
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Embracing the Ebb and Flow
colly
88
5k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.9k
Skip the Path - Find Your Career Trail
mkilby
1
110
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
530
Thoughts on Productivity
jonyablonski
76
5.1k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Crafting Experiences
bethany
1
130
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Transcript
Schemeの Ephemeron (と weak pair) Niyarin
Ephemeronの概要 About Ephemeron ・ R7RS large red/(SRFI 124) ・Weak-pairsの亜種 ・オリジナルはSmalltalkに搭載された機能
Smalltalk/vの作者の1人(George Bosworth)の発明 ・ポータブルに実装できない
弱参照の雑な説明 ・オブジェクトの生存判定に含まれない参照 → 弱参照からのみ参照されているオブジェクトは回収できる (マークフェーズに辿らない/リファレンスカウントに含めない) ・例 ) Lispのsymbol intern table
string->symbol したシンボルが不要になったらテーブルからも消したい
Weakpair ・carが 弱参照でcdrが強参照なペア 通常のpairと違う点(Mit Schemeの例) ・回収済みかの述語の weak-pair/car? ・carが回収済みの場合、weak-car すると、#falseが帰る 青:弱参照
赤:強参照
Weakpairで作るデータ構造1 ・Weak list ・Weak vector car部を弱参照のboxとして使う
Weakpairで作るデータ構造2 ・weak alist(flat) ・weak-pairと普通のpairを交互に配置した ・keyもvalも弱参照/keyが強参照でvalが弱参照も配置を変えるだけ
Ephemeron 「連想コンテナで今後assqされないkey-val対は不要」 ・keyが弱参照でvalが強さが仕様しだいな参照を持つ (1) keyが回収できるなら、valへの参照はできなくなる(broken状態) (2) valからのみkeyが強参照できる場合でも回収できる Weak pairの問題 pairの外でkeyがない(assqされない)が、
valから強参照があれば、不要でもメモリに残り続ける
Ephemeronで苦手なこと weak-listはできない↓ (finalizeがあれば少し事情が変わる) → あるcellのcarが回収された時点でcdrにいけなくなる ・weak containerの部品としては、weak-boxとしての使い方になる (通常のlistのcarにEphemeronをいれる) ・key-val対としては優秀
Ephemeronの回収可能/不可能の例 ・回収可能(broken)な例 ・回収されない例
Ephemeron処理系ごとの実装 いくつかの実装は完全ではない ”valのみからの強参照の場合回収できる”ができない → Chibischeme、Sagittarius、Gauche etc. Racket や MIT/GNU Schemeはできている
RacketやMIT/GNU Schemeではvalは弱参照扱い
Ephemeron処理系ごとの実装 ・自前のトレース系GCを持つ処理系は割とやるだけ "Ephemerons: A New Finalization Mechanism"に疑似コードがある ・Boehm GCは難しい 弱参照:GC_GENERAL_REGISTER_DISAPPEARING_LINK
ファイナライズ:GC_REGISTER_FINALIZER で、”keyが回収可能ならbrokenする”までは実装できる valからのみはこれだけではできない
EphemeronとSchemeの回収の扱い R7RSのメモリの扱い “they are permitted to reclaim the storage occupied
by an object.” → 「再利用を許可する」 再利用は許可されているだけなので、普通のconsでも良い (define make-ephemeron cons) (define ephemeron-key car) (define ephemeron-datum cdr) (define (ephemeron-broken? _) #f)
Sagittarius Schemeの現在の実装 ・Boehm GCを採用している処理系 “keyが回収済みならvalを返さない”ことまではできる datumへのアクセスはkeyの生存判定を都度やって実現している (define (ephemeron-broken? e) (weak-box-empty?
(ephemeron-key e))) (define (ephemeron-datum e) (and (not (ephemeron-broken? e) (%ephemeron-datum e)))
よく知られているトレース系GCでの扱い value部で使われていても回収できる = value部以外で使われていなれば回収できる → Ephemeronの外側を最初にトレースすれば良い 1.マークフェーズを行う ただしEphemeronに当たると、Ephemeron用Queueに入れて、中は辿らない 2.Ephemeron用Queueでkeyが生きているものはvalue部について1を行う Ephemeron用Queueでkeyが回収可能なものはbrokenする
⇑はとても端折ったので、"Ephemerons: A New Finalization Mechanism"を見る ただし、疑似コードがSmalltalkだけど
実用例:手続きのキャッシュ ・引数2以降や結果が引数1を強参照していてもキャッシュから消せる ・引数のどれかが回収されたら、キャッシュは使えない → 途中のEphemeronがbrokenになっても問題ない ・(Improper listなのは、 引数が生存している場合、結果は常に生存していて欲しいから) (引数と結果の組を保存して、 毎回計算しなくてよくする)
おわり ・Ephemeronは、キャッシュやテーブルの実装に役立つ ・SRFIにFinalize的なものが来ないかな... ・参照カウントを採用したSchemeのEphemeron採用例があったら楽しめたが.. → そもそも参照カウントなScheme実装はあまり聞かない ・ポータブルでちゃんと実装するのは難しい(できない)ので、 他のLisp方言の人たちはEphemeronが使えなくて悲しいでしょうね → Schemeは良いぞ