Skip to main content
࠷ۙͷൃలͱ
໨Լ࣮૷தͷมߋ
@ SATYSFI Conf 2021
2021 ೥ 6 ݄ 26 ೔
( @bd_gfngfn)
࠷΋؆ܿʹ‫ͱ͏ݴ‬
• օ͞Μͷ੒Ռɿ ຊ౰ʹૉ੖Β͍͠
• Θͨ͠ͷਐḿɿ μϝͰ͢!
֓ཁ
2
࠷΋؆ܿʹ‫ͱ͏ݴ‬
• օ͞Μͷ੒Ռɿ ຊ౰ʹૉ੖Β͍͠
• Θͨ͠ͷਐḿɿ μϝͰ͢!
※΋ͪΖΜԿ΋΍ͬͯͳ͍Θ͚Ͱ͸ͳ͍ɿ
• SATYSFI ຊମͷ։ൃ΋ਐߦத
– ϚΫϩల։࣌ͷΤϥʔҐஔใࠂ‫ػ‬ೳΛ v0.0.6 ͰϦϦʔε
• ͜ΕͰϚΫϩ‫ػ‬ೳ͕࠷௿‫༻࣮ݶ‬తʹͳͬͨ
– ϞδϡʔϧγεςϜͷ F-ing modules ԽʴͦΕʹ൐͏มߋʢ్தʣ
– OpenType ϥΠϒϥϦͷ࠶࣮૷ʴЋɿ otfm → otfed
• Sesterl ͱ͍͏ผͷ੩త‫ޠݴ͖ͭܕ‬Λ৽ͨʹ࣮૷͍ͯͨ͠
– ಘΒΕͨ‫ޠݴ‬ઃ‫ܭ‬ͷ஌‫͕ݟ‬ SATYSFI ʹ΋ϑΟʔυόοΫͰ͖ͦ͏
ࠓճ͸͜ΕΒͷࡶવͱͨ͠঺հͰ͢
֓ཁ
3
• ௚ۙͷ౤ೖ͞Εͨมߋ
• ௖͍ͨ PR ౳
• ϚΫϩల։தͷΤϥʔใࠂ‫ػ‬ೳ
• ໨Լ࣮૷தͷมߋ
• ϑΥϯτσίʔμ/ΤϯίʔμͷҠߦ
• ϞδϡʔϧγεςϜͷ F-ing modules Խ
• ·ͱΊ
• v0.0.6 (2021-02-06)
– ઢ‫ܕ‬ม‫׵‬ linear-transform-graphics [@monaqa]
– ଟஈ૊Έ page-break-multicolumn
– overfull/underfull ՄࢹԽΦϓγϣϯ —-debug-show-overfull
– ͦͷଞ༗ࢤͷํʑʹΑΔଟ͘ͷमਖ਼ʢCHANGELOG ࢀরʣ
௚ۙͷओͳมߋ
5
• v0.0.6 (2021-02-06)
– ઢ‫ܕ‬ม‫׵‬ linear-transform-graphics [@monaqa]
– ଟஈ૊Έ page-break-multicolumn
– overfull/underfull ՄࢹԽΦϓγϣϯ —-debug-show-overfull
– ͦͷଞ༗ࢤͷํʑʹΑΔଟ͘ͷमਖ਼ʢCHANGELOG ࢀরʣ
• v0.0.7 ༧ఆ
– ֎෦ϑΝΠϧಡΈࠐΈ read-file [@puripuri2100]
– document information dictionary ग़ྗ [@puripuri2100]
– ॲཧ‫ܥ‬Ϗϧυ࣌ͷ Ruby ඇґଘԽ [@leque]
• vminstdef.yaml ͷ಺༰͸ vminst.ml ʹҠߦ
– ਺ࣜதͷʢҰ෦‫߸ه‬আ͘ʣ೚ҙ Unicode ίʔυϙΠϯτ‫ڐ‬༰
• set-math-charͰ Roman, Italic ౳ͷελΠϧʹԠͯ͡ม‫׵‬΋Մೳ
௚ۙͷओͳมߋ
6
• ௚ۙͷ౤ೖ͞Εͨมߋ
• ௖͍ͨ PR ౳
• ϚΫϩల։தͷΤϥʔใࠂ‫ػ‬ೳ
• ໨Լ࣮૷தͷมߋ
• ϑΥϯτσίʔμ/ΤϯίʔμͷҠߦ
• ϞδϡʔϧγεςϜͷ F-ing modules Խ
• ·ͱΊ
😄 ‫ܕ‬ͷ͓͔͛Ͱਝ଎Ͱ਌੾ͳΤϥʔใࠂ͕खʹೖͬͨ
😩 ҰํͰɼͲ͏ͯ͠΋‫ߘݪ‬ͷ‫ه‬ड़͕
൥ࡶʹͳͬͯ͠·͏৔໘͕ग़ͯ͘Δ
• ಛʹυΩϡϝϯτ༻్Ͱ͸‫ܕ‬ͷ‫Ͱ఺؍‬ෳࡶͳσʔλ΋
؆ܿʹॻ͚Δ͜ͱ͕๬·Ε͕ͪ
͓͞Β͍ɿ ௨ৗͷ‫͋͑͞ܕ‬Ε͹ສࣄղܾ͔ʁˠ൱
8
‫಺ޠݴ‬ DSLɿ จࣈྻΛड͚औͬͯύʔε͢ΔίϚϯυΛ
༻ҙ͢Δ
͓͞Β͍ɿ φΠʔϰͳճආࡦ
9
amidakuji(```
|X|-|=|/| |
| |-||-|X|
|=|X|-||=|
|-||-|=|-|
|X|=|-|| |
```);
amidakuji([
[Cross ; Line ; … ];
[Empty ; Line ; … ];
[Double; Cross; … ];
…
]);
ίϚϯυͷධՁ͸ಈతʹʢʹ૊൛ॲཧ։࢝‫ʹޙ‬ʣߦͳΘΕΔͷͰ
DSL ͷߏจղੳ΋ಈతʹߦͳΘΕɼߏจΤϥʔͷൃ‫͕ݟ‬஗͍
• Τϥʔ͕ಈతʹग़Δੈքʹ‫ٯ‬໭Γ
‫಺ޠݴ‬ DSL ͚ͩલॲཧͰ͖Ε͹Α͍ͷͰ
ϚΫϩ‫ߏػ‬Λಋೖͯ͠લॲཧͰ͖ΔΑ͏ʹ͠Α͏
ϚΫϩ‫ʹߏػ‬΋༷ʑͳ࣮‫ํݱ‬๏͕͋Δ͕ɼͦͷ͏ͪͰ΋
ଟஈ֊‫ࢉܭ‬ [Davies 1996] [Taha  Sheard 2000] ʹ‫͠ݱ࣮͍ͯͮج‬Α͏
͓͞Β͍ɿ φΠʔϰͳճආࡦͷ໰୊఺ͱͦͷղܾࡦ
10
• ‫͕ࢉܭ‬ෳ਺ͷεςʔδʹ෼͔Εͨҙຯ࿦Λ΋ͭମ‫ܥ‬
ʴͦΕΛ҆શʹߦͳ͏ͨΊͷ‫ܕ‬γεςϜ
– stage 0, 1, 2, … Ͱɼ֤εςʔδ͸࣍ͷεςʔδͷίʔυΛੜ੒
• ͜͜Ͱ͸ stage 0ʢϚΫϩల։ʣͱ stage 1ʢ௨ৗͷධՁʣͷΈ࢖༻
– Lisp ͷ quasiquote ʹࣅΔ
– ྫɿ MetaML [Taha  Sheard 2000]ɼMetaOCaml [Kiselyov 2014]
Կ͕‫͔͍͠خ‬ʁ
• ‫҆ܕ‬શͳಈతίʔυੜ੒ʹ࢖͑Δ
– ʮϚΫϩఆٛʹ‫͚͕ͭܕ‬͹ɼల։‫ޙ‬ͷϓϩάϥϜ΋‫͕ͭ͘ܕ‬ʯ
͓͞Β͍ɿ ଟஈ֊‫ͱࢉܭ‬͸
11
• ϚΫϩ͸ྫ͑͹ҎԼͷΑ͏ͳ‫͏࢖Ͱܗ‬
– ~(…) ͸ϚΫϩల։Ͱ࢖ΘΕΔ stage 0 ͷ஋ͷҾ਺
– ~ ͷ͔ͭͳ͍Ҿ਺͸ίʔυஅยͱͯ͠ల։݁Ռʹ࢖ΘΕΔ stage 1 ͷҾ਺
• ϚΫϩͷఆ͓ٛΑͼద༻ͦΕࣗମ͕ల։ΑΓલʹ‫ࠪ͞ݕܕ‬ΕΔ
• య‫ܕ‬తʹ͸ϚΫϩల։ʢʹίʔυੜ੒ʣ͸
ҰॠͰऴΘΔͷͰɼϚΫϩల։ʹࣦഊ͢Ε͹
“࣮࣭੩తʹ” ΤϥʔใࠂՄೳ
• MacroML [Ganz, Sabry  Taha 2001]
ͱ͍͏ମ‫͍ۙʹܥ‬ఆࣜԽ
‫ޠݴ‬ઃ‫ܭ‬ͷ֓ཁ
12
repeat@~(3){foo}
% ௨ৗͷධՁͷλΠϛϯάͰ͸
% ࠷ॳ͔Β foofoofoo ͱॻ͍ͯ͋ͬͨͷͱಉ͡ʹͳΔ
amidakuji@~(```
|X|-|=|/| |
| |-||-|X|
|=|X|-||=|
|-||-|=|-|
|X|=|-|| |
```);
• ࠓճͷมߋɿ ϚΫϩల։Ͱࣦഊͨ࣌͠ʹதஅͯ͠
ΤϥʔͷՕॴΛใࠂ͢ΔͨΊͷ‫ػ‬ೳΛ৽ͨʹ௥Ճ
– DSL จࣈྻͷߏจղੳʹࣦഊͨ͠৔߹ʹ΋
Կߦ໨ͷԿจࣈ໨Ͱࣦഊ͔ͨ͠ϥΠϒϥϦͷਫ४Ͱग़ͤΔ
– @`…` ͰίʔυதͷҐஔ͕औΓग़ͤΔจࣈྻϦςϥϧ͕ॻ͚Δ
– @`…` : string * input-position
– get-input-position : input-position - string * int * int
‫ޠݴ‬ઃ‫ܭ‬ͷ֓ཁ
13
amidakuji@~(@```
|X|-|=|/| |
| |-||-|X|
|=|X|-||=|
|-||-|=|-|
|X|=|-|| |
```);
໭Γ஋͸
(ϑΝΠϧ໊, ߦ਺, จࣈ਺)
14
σϞɿ ϚΫϩ͕ਖ਼ৗʹॲཧ͞ΕΔ৔߹
https://drive.google.com/file/d/1l9HeT6Hn_lNn0ptVobVDYwW6T9A8xKvZ/view?usp=sharing
15
σϞɿ DSL ίʔυதʹߏจΤϥʔ͕͋Δ৔߹
https://drive.google.com/file/d/1pbTOSWiflEkTghS3TzlerG5NCcb2iIoI/view?usp=sharing
• ௚ۙͷ౤ೖ͞Εͨมߋ
• ௖͍ͨ PR ౳
• ϚΫϩల։தͷΤϥʔใࠂ‫ػ‬ೳ
• ໨Լ࣮૷தͷมߋ
• ϑΥϯτσίʔμ/ΤϯίʔμͷҠߦ
• ϞδϡʔϧγεςϜͷ F-ing modules Խ
• ·ͱΊ
• σίʔμ/ΤϯίʔμʹखΛՃ͑Δಈ‫ػ‬ɿ
– ϑΥϯτ৘ใΛ SATYSFI ͷਫ४Ͱॊೈʹѻ͑ΔΑ͏ʹ͍ͨ͠
• ߹ࣈɼΧʔχϯάɼࣈ‫੾ܗ‬ସ͑ͱ͍ͬͨ feature ͷ on/off ‫ػ‬ೳ
• άϥϑΟοΫεͷύεͱͯ͠࢖͑ΔΑ͏ʹ͢Δ etc.
– ҟମࣈηϨΫλରԠ
– ͦ΋ͦ΋ OCaml ͰϑΥϯτ৘ใΛ͍͡Γ͍ͨਓ͸
ଟ෼͜ͷੈքʹ 10 ਓ͘Β͍͔͍͠ͳ͍ͷͰࣗ෼Ͱ΍Δ͔͠ͳ͍💪
• ैདྷɿ ‫ط‬ଘϥΠϒϥϦ otfm ΛࣗલͰେ෯֦ு͠࢖༻
– github.com/dbuenzli/otfm → github.com/gfngfn/otfm
– Ұຕ‫Ͱؠ‬εςʔτϑϧͳ࣮૷ɼςετͳ͠
– ‫͜ʹط‬ΕҎ্։ൃΛ‫ܧ‬ଓͨ͘͠ͳ͍ঢ়ଶ
ϑΥϯτσίʔμ/ΤϯίʔμͷҠߦ
17
• ৽ͨʹθϩ͔Β otfed ͱ͍͏ϥΠϒϥϦΛ࣮૷ͨ͠
– github.com/gfngfn/otfed
– ‫ैʹط‬དྷͷେ෯֦ு൛ otfm ͷαϙʔτൣғΛ໢ཏʢͨ͠͸ͣʣ
• PDF ΁ͷ෦෼ຒΊࠐΈͷ࣮૷΋ OK
– εςʔτϨεɼ҃Δఔ౓͸ςετॻ͍ͯΔ
– OCaml ੡Ͱ͸࠷΋ॆ࣮ͨ͠ OpenType ϥΠϒϥϦʹͳ͔ͬͨ΋
– Ϟδϡʔϧߏ଄Λ੔಴ͯۙ͠ʑ OPAM ʹެ։͍ͨ͠
ϑΥϯτσίʔμ/ΤϯίʔμͷҠߦ
18
ͱ͍͏Θ͚Ͱ
• ௚ۙͷ౤ೖ͞Εͨมߋ
• ௖͍ͨ PR ౳
• ϚΫϩల։தͷΤϥʔใࠂ‫ػ‬ೳ
• ໨Լ࣮૷தͷมߋ
• ϑΥϯτσίʔμ/ΤϯίʔμͷҠߦ
• ϞδϡʔϧγεςϜͷ F-ing modules Խ
• ·ͱΊ
• ύοέʔδಡࠐΈͷ࢓૊Έ͸΋ͱ΋ͱະ౿ͷ੒Ռใࠂձͷ
਺೔લʹಥ؏޻ࣄͰ࣮૷ͨ͠΋ͷͰɼ͔ͳΓΞυϗοΫ
– ֤ύοέʔδϑΝΠϧؒͷґଘؔ܎Λ΋ͱʹ
τϙϩδΧϧιʔτ͠ɼ1ͭͣͭಉ໊͡લۭؒʹಡΈࠐΉ
• ෳ਺ͷύοέʔδͰఆ໊ٛͨ͠લ͕ͨ·ͨ·ॏෳ͠͏Δ
• ؒ઀తʹ͔͠ґଘ͠ͳ͍ύοέʔδͰఆٛ͞Εͨ΋ͷ΋શͯείʔϓʹೖΔ
– Ϟδϡʔϧ໊͕લۭؒͷ෼཭ʹҰԠ࢖͑Δ͕ɼ
άϩʔόϧʹ΋വ਺΍‫͕ܕ‬ఆٛͰ͖ͯ͠·͏
• ఆ਺ΛϞδϡʔϧ֎͔Βࢦఆ͢Δ‫ه‬ड़͕ࣗવʹ͸Ͱ͖ͣɼ
ϑΥϯτઃఆͳͲ͕ύοέʔδ͝ͱʹܾΊଧͪʹͳΓ΍͍͢
ύοέʔδͱϞδϡʔϧͷ՝୊
20
% ϑΝΠϧઌ಄ʹґଘύοέʔδΛॻ͘
@require: stdjareport
@require: code
⋮
• ϞδϡʔϧγεςϜͷମ‫ͯ͠ͱܥ‬
F-ing modules [Rossberg, Russo  Dreyer 2014] Λ࠾༻͠ҎԼΛαϙʔτ
– ೖΕࢠͷϞδϡʔϧ
– ϑΝϯΫλʢʹ“ϞδϡʔϧΛϞδϡʔϧʹࣸ͢େ͖͍വ਺”ɼ‫ޙ‬ड़ʣ
• 1 ύοέʔδશମ͕ 1 Ϟδϡʔϧʹͳ͍ͬͯΔ΋ͷͷΈೝΊΔ
– ඞཁͳΒͦͷதͰϞδϡʔϧΛೖΕࢠʹ͢Ε͹Α͍
– ෳ਺ϑΝΠϧʹ෼ׂͰ͖Δ‫ߏػ‬͸ద੾ʹ༻ҙ͢Δ
• @require ͳͲͰཅʹґଘͨ͠ύοέʔδ͔͠είʔϓʹೖΕͳ͍
– ൺֱత৽͍͠ଟ͘ͷ‫Ͱޠݴ‬͸͜͏ͳ͍ͬͯΔ͸ͣ
SATYSFI ͱ͸ผʹ։ൃ͍ͯͨ͠‫ޠݴ‬ Sesterl Ͱ͜ΕΒͷ࢓૊ΈΛ
ઌΜͯ͡ಋೖ͠ɼ؆ܿͰ‫ے‬ͷྑ͍ఆࣜԽͩΖ͏ͱ‫͡ײ‬औΕͨ
վળҊ
21
͓͞Β͍ɿ ϑΝϯΫλ͕͋ΔͱͲ͏‫͔͍͠خ‬
22
@require code
module PyCode =
Code.Make(struct
val base-font = (`Menlo`, 1., 0.)
val highlight = Code.Syntax.python3
end)
⋮
{… PyCode.show(`print(“Hi!”)`); …}
• ‫ݱ‬ঢ়ɿ
– code ίϚϯυʹΑͬͯදࣔ͞ΕΔϑΥϯτ͸ܾΊଧͪ
– શମΛมߋ͢Δ API ͷఏ‫ڙ‬΋ՄೳͰ͸͋Δ͕͗ͪ͜ͳ͍
• ͜͏͍ͨ͠ɿ
@require code
⋮
{… code(`print(“Hi!”)`); …}
ϑΝϯΫλCode.Makeʹ
ελΠϧઃఆͷϞδϡʔϧΛ౉͠ɼ
ઃఆ͕൓ө͞Εͨ݁ՌΛ
PyCodeͱ͍͏Ϟδϡʔϧͱͯ͠࢖͏
• ‫ثࠪݕܕ‬͸ͦΕͳΓʹ࣮૷͕ਐߦ
– refactor-internal ͱ͍͏branchͰ࡞‫ۀ‬தʢϦϑΝΫλͰ͸ͳ͍ʣ
– ‫ࡏݱ‬ ʴ3600ߦɼ−1900ߦ ఔ౓ɼମ‫Ͱײ‬͸·࢛ͩ߹໨͘Β͍ʁ
• ‫ޠݴ‬ઃ‫ͯ͠ͱܭ‬ϞδϡʔϧγεςϜͱͷ‫ڞ‬ଘ͕ඇࣗ໌ͳͱ͜Ζɿ
– mutable reference
• relaxed value restriction [Garrigue 2004] ͷ࠶੔උͳͲͷ޻෉͕ཁΔ
• Ͱ͖Ε͹͜ͷࡍ monadic ͳఆࣜԽʹ͍͔ͨ͠΋ʁ
– ଟஈ֊‫ࢉܭ‬
• ௨ৗͷଋറ͸େৎ෉ͦ͏͕ͩɼϚΫϩఆٛ͸‫ڞ‬ଘ͕೉͍͠
– Satyrographos [@na4zagin3] ͱͷ࿈‫͕ܞ‬ඞཁ͔΋
• ‫ݱ‬ঢ়ͷ SATYSFI ͸ OPAM ύοέʔδʹ૬౰͢Δ୯ҐΛ΋ͨͳ͍
ઃ‫ܭ‬ɾ࣮૷ͷਐలͱ༧૝͞ΕΔ೉ॴ
23
• ௚ۙͷ౤ೖ͞Εͨมߋ
• ௖͍ͨ PR ౳
• ϚΫϩల։தͷΤϥʔใࠂ‫ػ‬ೳ
• ໨Լ࣮૷தͷมߋ
• ϑΥϯτσίʔμ/ΤϯίʔμͷҠߦ
• ϞδϡʔϧγεςϜͷ F-ing modules Խ
• ·ͱΊ
• ࠷ۙಋೖͨ͠ɿ
– ଟஈ૊Έ
– ϚΫϩల։தͷΤϥʔͰҐஔΛใࠂ͢ΔͨΊͷ‫ػ‬ೳ
– ਺ࣜதͰ೚ҙίʔυϙΠϯτ࢖༻Մ
– ௖͍ͨछʑͷ PRɿ
• άϥϑΟοΫεͷઢ‫ܕ‬ม‫׵‬ɼ֎෦ϑΝΠϧಡΈࠐΈɼ
Ruby ґଘআ‫ڈ‬ɼetc.
• ‫ࡏݱ‬ਐߦதɿ
– ϑΥϯτσίʔμ/Τϯίʔμͷ࠶࣮૷ͱ֦ு
– F-ing modules ʹ‫ͮ͘ج‬ϞδϡʔϧγεςϜͷ࣮૷
·ͱΊ
25
• Rowan Davies. A temporal-logic approach to binding-time analysis. In Proc. of LICS’96, pages
184–195, 1996.
• Martin Elsman, Troels Henriksen, Danil Annenkov, and Cosmin E. Oancea. Static interpretation
of higher-order modules in Futhark: functional GPU programming in the large. In Proc. of
ICFP’18, Article 97, 2018.
• Steve Ganz, Amr Sabry, and Walid Taha. Macros as multi-stage computations: type-safe,
generative, binding macros in MacroML. In Proc. of ICFP’01, pages 74–85, 2001.
• Jacques Garrigue. Relaxing the Value Restriction. In Functional and Logic Programming.
FLOPS 2004. Lecture Notes in Computer Science, vol 2998, 2004.
• Oleg Kiselyov. The design and implementation of BER MetaOCaml. In Functional and Logic
Programming. FLOPS 2014. Lecture Notes in Computer Science, vol 8475, 2014.
• Andreas Rossberg, Claudio Russo, and Derek Dreyer. F-ing modules. Journal of Functional
Programming, 24(5), pp. 529–607, 2014.
• Walid Taha and Tim Sheard. Multi-stage programming with explicit annotations. Theoretical
Computer Science, 248 (1-2), pages 211–242, 2000.
ࢀߟจ‫ݙ‬
26