Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
SchemeのEphemeronとWeak Pairの説明
Search
Niyarin
June 25, 2020
Programming
0
1.1k
SchemeのEphemeronとWeak Pairの説明
Niyarin
June 25, 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
450
Gorgos-parser-combinator-written-in-scheme
niyarin
0
400
outputting-beautiful-s-expression
niyarin
0
400
Serialisp
niyarin
1
690
Mongo DBとS式検索
niyarin
0
340
goodbye-python-repl
niyarin
0
380
red-paren-scheme-rev-macro.pdf
niyarin
0
430
Other Decks in Programming
See All in Programming
Grafana:建立系統全知視角的捷徑
blueswen
0
220
AIコーディングエージェント(NotebookLM)
kondai24
0
230
AtCoder Conference 2025「LLM時代のAHC」
imjk
2
590
AIコーディングエージェント(skywork)
kondai24
0
210
Claude Codeの「Compacting Conversation」を体感50%減! CLAUDE.md + 8 Skills で挑むコンテキスト管理術
kmurahama
1
640
Giselleで作るAI QAアシスタント 〜 Pull Requestレビューに継続的QAを
codenote
0
300
Basic Architectures
denyspoltorak
0
120
The Art of Re-Architecture - Droidcon India 2025
siddroid
0
130
C-Shared Buildで突破するAI Agent バックテストの壁
po3rin
0
420
PC-6001でPSG曲を鳴らすまでを全部NetBSD上の Makefile に押し込んでみた / osc2025hiroshima
tsutsui
0
190
生成AI時代を勝ち抜くエンジニア組織マネジメント
coconala_engineer
0
21k
JETLS.jl ─ A New Language Server for Julia
abap34
2
460
Featured
See All Featured
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.7k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
120
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
190
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
410
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
0
210
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2k
Done Done
chrislema
186
16k
Speed Design
sergeychernyshev
33
1.4k
Designing for Performance
lara
610
69k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
65
35k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
37
2.7k
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は良いぞ