࠷ۙͷൃలͱ
໨Լ࣮૷தͷมߋ
@ 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

SATySFi 最近の発展と目下実装中の変更

  • 1.
    ࠷ۙͷൃలͱ ໨Լ࣮૷தͷมߋ @ SATYSFI Conf2021 2021 ೥ 6 ݄ 26 ೔ ( @bd_gfngfn)
  • 2.
  • 3.
    ࠷΋؆ܿʹ‫ͱ͏ݴ‬ • օ͞Μͷ੒Ռɿ ຊ౰ʹૉ੖Β͍͠ •Θͨ͠ͷਐḿɿ μϝͰ͢! ※΋ͪΖΜԿ΋΍ͬͯͳ͍Θ͚Ͱ͸ͳ͍ɿ • SATYSFI ຊମͷ։ൃ΋ਐߦத – ϚΫϩల։࣌ͷΤϥʔҐஔใࠂ‫ػ‬ೳΛ v0.0.6 ͰϦϦʔε • ͜ΕͰϚΫϩ‫ػ‬ೳ͕࠷௿‫༻࣮ݶ‬తʹͳͬͨ – ϞδϡʔϧγεςϜͷ F-ing modules ԽʴͦΕʹ൐͏มߋʢ్தʣ – OpenType ϥΠϒϥϦͷ࠶࣮૷ʴЋɿ otfm → otfed • Sesterl ͱ͍͏ผͷ੩త‫ޠݴ͖ͭܕ‬Λ৽ͨʹ࣮૷͍ͯͨ͠ – ಘΒΕͨ‫ޠݴ‬ઃ‫ܭ‬ͷ஌‫͕ݟ‬ SATYSFI ʹ΋ϑΟʔυόοΫͰ͖ͦ͏ ࠓճ͸͜ΕΒͷࡶવͱͨ͠঺հͰ͢ ֓ཁ 3
  • 4.
    • ௚ۙͷ౤ೖ͞Εͨมߋ • ௖͍ͨPR ౳ • ϚΫϩల։தͷΤϥʔใࠂ‫ػ‬ೳ • ໨Լ࣮૷தͷมߋ • ϑΥϯτσίʔμ/ΤϯίʔμͷҠߦ • ϞδϡʔϧγεςϜͷ F-ing modules Խ • ·ͱΊ
  • 5.
    • v0.0.6 (2021-02-06) –ઢ‫ܕ‬ม‫׵‬ linear-transform-graphics [@monaqa] – ଟஈ૊Έ page-break-multicolumn – overfull/underfull ՄࢹԽΦϓγϣϯ —-debug-show-overfull – ͦͷଞ༗ࢤͷํʑʹΑΔଟ͘ͷमਖ਼ʢCHANGELOG ࢀরʣ ௚ۙͷओͳมߋ 5
  • 6.
    • 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
  • 7.
    • ௚ۙͷ౤ೖ͞Εͨมߋ • ௖͍ͨPR ౳ • ϚΫϩల։தͷΤϥʔใࠂ‫ػ‬ೳ • ໨Լ࣮૷தͷมߋ • ϑΥϯτσίʔμ/ΤϯίʔμͷҠߦ • ϞδϡʔϧγεςϜͷ F-ing modules Խ • ·ͱΊ
  • 8.
    😄 ‫ܕ‬ͷ͓͔͛Ͱਝ଎Ͱ਌੾ͳΤϥʔใࠂ͕खʹೖͬͨ 😩 ҰํͰɼͲ͏ͯ͠΋‫ߘݪ‬ͷ‫ه‬ड़͕ ൥ࡶʹͳͬͯ͠·͏৔໘͕ग़ͯ͘Δ •ಛʹυΩϡϝϯτ༻్Ͱ͸‫ܕ‬ͷ‫Ͱ఺؍‬ෳࡶͳσʔλ΋ ؆ܿʹॻ͚Δ͜ͱ͕๬·Ε͕ͪ ͓͞Β͍ɿ ௨ৗͷ‫͋͑͞ܕ‬Ε͹ສࣄղܾ͔ʁˠ൱ 8
  • 9.
    ‫಺ޠݴ‬ DSLɿ จࣈྻΛड͚औͬͯύʔε͢ΔίϚϯυΛ ༻ҙ͢Δ ͓͞Β͍ɿφΠʔϰͳճආࡦ 9 amidakuji(``` |X|-|=|/| | | |-||-|X| |=|X|-||=| |-||-|=|-| |X|=|-|| | ```); amidakuji([ [Cross ; Line ; … ]; [Empty ; Line ; … ]; [Double; Cross; … ]; … ]);
  • 10.
    ίϚϯυͷධՁ͸ಈతʹʢʹ૊൛ॲཧ։࢝‫ʹޙ‬ʣߦͳΘΕΔͷͰ DSL ͷߏจղੳ΋ಈతʹߦͳΘΕɼߏจΤϥʔͷൃ‫͕ݟ‬஗͍ • Τϥʔ͕ಈతʹग़Δੈքʹ‫ٯ‬໭Γ ‫಺ޠݴ‬DSL ͚ͩલॲཧͰ͖Ε͹Α͍ͷͰ ϚΫϩ‫ߏػ‬Λಋೖͯ͠લॲཧͰ͖ΔΑ͏ʹ͠Α͏ ϚΫϩ‫ʹߏػ‬΋༷ʑͳ࣮‫ํݱ‬๏͕͋Δ͕ɼͦͷ͏ͪͰ΋ ଟஈ֊‫ࢉܭ‬ [Davies 1996] [Taha Sheard 2000] ʹ‫͠ݱ࣮͍ͯͮج‬Α͏ ͓͞Β͍ɿ φΠʔϰͳճආࡦͷ໰୊఺ͱͦͷղܾࡦ 10
  • 11.
    • ‫͕ࢉܭ‬ෳ਺ͷεςʔδʹ෼͔Εͨҙຯ࿦Λ΋ͭମ‫ܥ‬ ʴͦΕΛ҆શʹߦͳ͏ͨΊͷ‫ܕ‬γεςϜ – stage0, 1, 2, … Ͱɼ֤εςʔδ͸࣍ͷεςʔδͷίʔυΛੜ੒ • ͜͜Ͱ͸ stage 0ʢϚΫϩల։ʣͱ stage 1ʢ௨ৗͷධՁʣͷΈ࢖༻ – Lisp ͷ quasiquote ʹࣅΔ – ྫɿ MetaML [Taha Sheard 2000]ɼMetaOCaml [Kiselyov 2014] Կ͕‫͔͍͠خ‬ʁ • ‫҆ܕ‬શͳಈతίʔυੜ੒ʹ࢖͑Δ – ʮϚΫϩఆٛʹ‫͚͕ͭܕ‬͹ɼల։‫ޙ‬ͷϓϩάϥϜ΋‫͕ͭ͘ܕ‬ʯ ͓͞Β͍ɿ ଟஈ֊‫ͱࢉܭ‬͸ 11
  • 12.
    • ϚΫϩ͸ྫ͑͹ҎԼͷΑ͏ͳ‫͏࢖Ͱܗ‬ – ~(…)͸ϚΫϩల։Ͱ࢖ΘΕΔ stage 0 ͷ஋ͷҾ਺ – ~ ͷ͔ͭͳ͍Ҿ਺͸ίʔυஅยͱͯ͠ల։݁Ռʹ࢖ΘΕΔ stage 1 ͷҾ਺ • ϚΫϩͷఆ͓ٛΑͼద༻ͦΕࣗମ͕ల։ΑΓલʹ‫ࠪ͞ݕܕ‬ΕΔ • య‫ܕ‬తʹ͸ϚΫϩల։ʢʹίʔυੜ੒ʣ͸ ҰॠͰऴΘΔͷͰɼϚΫϩల։ʹࣦഊ͢Ε͹ “࣮࣭੩తʹ” ΤϥʔใࠂՄೳ • MacroML [Ganz, Sabry Taha 2001] ͱ͍͏ମ‫͍ۙʹܥ‬ఆࣜԽ ‫ޠݴ‬ઃ‫ܭ‬ͷ֓ཁ 12 repeat@~(3){foo} % ௨ৗͷධՁͷλΠϛϯάͰ͸ % ࠷ॳ͔Β foofoofoo ͱॻ͍ͯ͋ͬͨͷͱಉ͡ʹͳΔ amidakuji@~(``` |X|-|=|/| | | |-||-|X| |=|X|-||=| |-||-|=|-| |X|=|-|| | ```);
  • 13.
    • ࠓճͷมߋɿ ϚΫϩల։Ͱࣦഊͨ࣌͠ʹதஅͯ͠ ΤϥʔͷՕॴΛใࠂ͢ΔͨΊͷ‫ػ‬ೳΛ৽ͨʹ௥Ճ –DSL จࣈྻͷߏจղੳʹࣦഊͨ͠৔߹ʹ΋ Կߦ໨ͷԿจࣈ໨Ͱࣦഊ͔ͨ͠ϥΠϒϥϦͷਫ४Ͱग़ͤΔ – @`…` ͰίʔυதͷҐஔ͕औΓग़ͤΔจࣈྻϦςϥϧ͕ॻ͚Δ – @`…` : string * input-position – get-input-position : input-position - string * int * int ‫ޠݴ‬ઃ‫ܭ‬ͷ֓ཁ 13 amidakuji@~(@``` |X|-|=|/| | | |-||-|X| |=|X|-||=| |-||-|=|-| |X|=|-|| | ```); ໭Γ஋͸ (ϑΝΠϧ໊, ߦ਺, จࣈ਺)
  • 14.
  • 15.
  • 16.
    • ௚ۙͷ౤ೖ͞Εͨมߋ • ௖͍ͨPR ౳ • ϚΫϩల։தͷΤϥʔใࠂ‫ػ‬ೳ • ໨Լ࣮૷தͷมߋ • ϑΥϯτσίʔμ/ΤϯίʔμͷҠߦ • ϞδϡʔϧγεςϜͷ F-ing modules Խ • ·ͱΊ
  • 17.
    • σίʔμ/ΤϯίʔμʹखΛՃ͑Δಈ‫ػ‬ɿ – ϑΥϯτ৘ใΛSATYSFI ͷਫ४Ͱॊೈʹѻ͑ΔΑ͏ʹ͍ͨ͠ • ߹ࣈɼΧʔχϯάɼࣈ‫੾ܗ‬ସ͑ͱ͍ͬͨ feature ͷ on/off ‫ػ‬ೳ • άϥϑΟοΫεͷύεͱͯ͠࢖͑ΔΑ͏ʹ͢Δ etc. – ҟମࣈηϨΫλରԠ – ͦ΋ͦ΋ OCaml ͰϑΥϯτ৘ใΛ͍͡Γ͍ͨਓ͸ ଟ෼͜ͷੈքʹ 10 ਓ͘Β͍͔͍͠ͳ͍ͷͰࣗ෼Ͱ΍Δ͔͠ͳ͍💪 • ैདྷɿ ‫ط‬ଘϥΠϒϥϦ otfm ΛࣗલͰେ෯֦ு͠࢖༻ – github.com/dbuenzli/otfm → github.com/gfngfn/otfm – Ұຕ‫Ͱؠ‬εςʔτϑϧͳ࣮૷ɼςετͳ͠ – ‫͜ʹط‬ΕҎ্։ൃΛ‫ܧ‬ଓͨ͘͠ͳ͍ঢ়ଶ ϑΥϯτσίʔμ/ΤϯίʔμͷҠߦ 17
  • 18.
    • ৽ͨʹθϩ͔Β otfedͱ͍͏ϥΠϒϥϦΛ࣮૷ͨ͠ – github.com/gfngfn/otfed – ‫ैʹط‬དྷͷେ෯֦ு൛ otfm ͷαϙʔτൣғΛ໢ཏʢͨ͠͸ͣʣ • PDF ΁ͷ෦෼ຒΊࠐΈͷ࣮૷΋ OK – εςʔτϨεɼ҃Δఔ౓͸ςετॻ͍ͯΔ – OCaml ੡Ͱ͸࠷΋ॆ࣮ͨ͠ OpenType ϥΠϒϥϦʹͳ͔ͬͨ΋ – Ϟδϡʔϧߏ଄Λ੔಴ͯۙ͠ʑ OPAM ʹެ։͍ͨ͠ ϑΥϯτσίʔμ/ΤϯίʔμͷҠߦ 18 ͱ͍͏Θ͚Ͱ
  • 19.
    • ௚ۙͷ౤ೖ͞Εͨมߋ • ௖͍ͨPR ౳ • ϚΫϩల։தͷΤϥʔใࠂ‫ػ‬ೳ • ໨Լ࣮૷தͷมߋ • ϑΥϯτσίʔμ/ΤϯίʔμͷҠߦ • ϞδϡʔϧγεςϜͷ F-ing modules Խ • ·ͱΊ
  • 20.
    • ύοέʔδಡࠐΈͷ࢓૊Έ͸΋ͱ΋ͱະ౿ͷ੒Ռใࠂձͷ ਺೔લʹಥ؏޻ࣄͰ࣮૷ͨ͠΋ͷͰɼ͔ͳΓΞυϗοΫ – ֤ύοέʔδϑΝΠϧؒͷґଘؔ܎Λ΋ͱʹ τϙϩδΧϧιʔτ͠ɼ1ͭͣͭಉ໊͡લۭؒʹಡΈࠐΉ •ෳ਺ͷύοέʔδͰఆ໊ٛͨ͠લ͕ͨ·ͨ·ॏෳ͠͏Δ • ؒ઀తʹ͔͠ґଘ͠ͳ͍ύοέʔδͰఆٛ͞Εͨ΋ͷ΋શͯείʔϓʹೖΔ – Ϟδϡʔϧ໊͕લۭؒͷ෼཭ʹҰԠ࢖͑Δ͕ɼ άϩʔόϧʹ΋വ਺΍‫͕ܕ‬ఆٛͰ͖ͯ͠·͏ • ఆ਺ΛϞδϡʔϧ֎͔Βࢦఆ͢Δ‫ه‬ड़͕ࣗવʹ͸Ͱ͖ͣɼ ϑΥϯτઃఆͳͲ͕ύοέʔδ͝ͱʹܾΊଧͪʹͳΓ΍͍͢ ύοέʔδͱϞδϡʔϧͷ՝୊ 20 % ϑΝΠϧઌ಄ʹґଘύοέʔδΛॻ͘ @require: stdjareport @require: code ⋮
  • 21.
    • ϞδϡʔϧγεςϜͷମ‫ͯ͠ͱܥ‬ F-ing modules[Rossberg, Russo Dreyer 2014] Λ࠾༻͠ҎԼΛαϙʔτ – ೖΕࢠͷϞδϡʔϧ – ϑΝϯΫλʢʹ“ϞδϡʔϧΛϞδϡʔϧʹࣸ͢େ͖͍വ਺”ɼ‫ޙ‬ड़ʣ • 1 ύοέʔδશମ͕ 1 Ϟδϡʔϧʹͳ͍ͬͯΔ΋ͷͷΈೝΊΔ – ඞཁͳΒͦͷதͰϞδϡʔϧΛೖΕࢠʹ͢Ε͹Α͍ – ෳ਺ϑΝΠϧʹ෼ׂͰ͖Δ‫ߏػ‬͸ద੾ʹ༻ҙ͢Δ • @require ͳͲͰཅʹґଘͨ͠ύοέʔδ͔͠είʔϓʹೖΕͳ͍ – ൺֱత৽͍͠ଟ͘ͷ‫Ͱޠݴ‬͸͜͏ͳ͍ͬͯΔ͸ͣ SATYSFI ͱ͸ผʹ։ൃ͍ͯͨ͠‫ޠݴ‬ Sesterl Ͱ͜ΕΒͷ࢓૊ΈΛ ઌΜͯ͡ಋೖ͠ɼ؆ܿͰ‫ے‬ͷྑ͍ఆࣜԽͩΖ͏ͱ‫͡ײ‬औΕͨ վળҊ 21
  • 22.
    ͓͞Β͍ɿ ϑΝϯΫλ͕͋ΔͱͲ͏‫͔͍͠خ‬ 22 @require code modulePyCode = 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ͱ͍͏Ϟδϡʔϧͱͯ͠࢖͏
  • 23.
    • ‫ثࠪݕܕ‬͸ͦΕͳΓʹ࣮૷͕ਐߦ – refactor-internalͱ͍͏branchͰ࡞‫ۀ‬தʢϦϑΝΫλͰ͸ͳ͍ʣ – ‫ࡏݱ‬ ʴ3600ߦɼ−1900ߦ ఔ౓ɼମ‫Ͱײ‬͸·࢛ͩ߹໨͘Β͍ʁ • ‫ޠݴ‬ઃ‫ͯ͠ͱܭ‬ϞδϡʔϧγεςϜͱͷ‫ڞ‬ଘ͕ඇࣗ໌ͳͱ͜Ζɿ – mutable reference • relaxed value restriction [Garrigue 2004] ͷ࠶੔උͳͲͷ޻෉͕ཁΔ • Ͱ͖Ε͹͜ͷࡍ monadic ͳఆࣜԽʹ͍͔ͨ͠΋ʁ – ଟஈ֊‫ࢉܭ‬ • ௨ৗͷଋറ͸େৎ෉ͦ͏͕ͩɼϚΫϩఆٛ͸‫ڞ‬ଘ͕೉͍͠ – Satyrographos [@na4zagin3] ͱͷ࿈‫͕ܞ‬ඞཁ͔΋ • ‫ݱ‬ঢ়ͷ SATYSFI ͸ OPAM ύοέʔδʹ૬౰͢Δ୯ҐΛ΋ͨͳ͍ ઃ‫ܭ‬ɾ࣮૷ͷਐలͱ༧૝͞ΕΔ೉ॴ 23
  • 24.
    • ௚ۙͷ౤ೖ͞Εͨมߋ • ௖͍ͨPR ౳ • ϚΫϩల։தͷΤϥʔใࠂ‫ػ‬ೳ • ໨Լ࣮૷தͷมߋ • ϑΥϯτσίʔμ/ΤϯίʔμͷҠߦ • ϞδϡʔϧγεςϜͷ F-ing modules Խ • ·ͱΊ
  • 25.
    • ࠷ۙಋೖͨ͠ɿ – ଟஈ૊Έ –ϚΫϩల։தͷΤϥʔͰҐஔΛใࠂ͢ΔͨΊͷ‫ػ‬ೳ – ਺ࣜதͰ೚ҙίʔυϙΠϯτ࢖༻Մ – ௖͍ͨछʑͷ PRɿ • άϥϑΟοΫεͷઢ‫ܕ‬ม‫׵‬ɼ֎෦ϑΝΠϧಡΈࠐΈɼ Ruby ґଘআ‫ڈ‬ɼetc. • ‫ࡏݱ‬ਐߦதɿ – ϑΥϯτσίʔμ/Τϯίʔμͷ࠶࣮૷ͱ֦ு – F-ing modules ʹ‫ͮ͘ج‬ϞδϡʔϧγεςϜͷ࣮૷ ·ͱΊ 25
  • 26.
    • 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