1
0
mirror of https://github.com/dhil/phd-dissertation synced 2026-03-13 19:18:25 +00:00

Compare commits

..

267 Commits

Author SHA1 Message Date
Daniel Hillerström
c2d79e1d06 Fix bibliography: add missing year 2025-12-18 14:08:13 +00:00
Daniel Hillerström
47410e4d14 Fix typo in -ctrl+ rule. The delimiter is part of the reified context. 2025-12-18 14:07:59 +00:00
81a4ecec0b UNIX tutorial 2024 2024-10-11 15:45:34 +02:00
cafa8b1ba2 Merge branch 'master' of github.com:dhil/phd-dissertation 2024-02-26 09:51:21 +01:00
2e61275a5b Fix typo; fix sentence structure.
This commit fixes a typo in the type signature of `init` (thanks to
Ramsay Carslaw for spotting it). This commit also structures the last
sentence of Section 2.7 to read slightly better.
2024-02-26 09:50:56 +01:00
e90ba67a4b Update timeline 2023-09-14 09:22:21 +02:00
6aee80a71b Fix typo 2023-09-14 09:14:29 +02:00
aea67c86b4 Fix typo 2023-04-12 14:55:37 +02:00
Daniel Hillerström
5ede30903f Fix typo 2023-02-14 10:59:29 +01:00
Daniel Hillerström
03b7c5b548 Fix typo. Slightly reword an awkward sentence. 2023-02-10 14:31:37 +01:00
7535fe7ecc Fix typos in handler typing rules in the appendix 2023-01-09 17:00:38 +00:00
72b54ad278 Add missing space in 'Evaluationcontexts' in Figure 3.5 2023-01-09 14:45:32 +00:00
01e707822f Fix typo in T-Let Figure 3.4 2023-01-09 14:42:09 +00:00
2cecb13d34 Update all slides 2022-11-17 15:05:18 +00:00
ed634fcaa3 Update slides 2022-11-17 11:10:29 +00:00
c60dc80fde Update slides 2022-11-16 23:42:00 +00:00
e86597f4e4 Draft lecture notes 2022-11-16 22:02:05 +00:00
2b7b1df8db Merge branch 'master' of github.com:dhil/phd-dissertation 2022-11-15 18:01:32 +00:00
20f44ad547 Fix typo 2022-11-15 18:01:26 +00:00
101ac96aa2 NU PRL slides 2022-11-02 15:45:00 +00:00
e6182105de Merge branch 'master' of github.com:dhil/phd-dissertation 2022-10-12 23:56:05 +01:00
63fe9a738a Prepare slides for Huawei Research Centre Zurich seminar 2022-10-12 23:55:57 +01:00
3a9394baf8 Fix a minor typo 2022-07-01 01:19:43 +01:00
6193214890 Update slides 2022-05-26 18:27:32 +01:00
ffe6ebd0b9 Update MSR 2022 slides 2022-05-25 22:29:14 +01:00
01a8a3d581 Draft MSR talk 2022-05-25 22:24:31 +01:00
008e80ea67 Link to thesis.
Update README to reflect the structure of the revised thesis.
2022-03-26 00:18:14 +00:00
3276537ab1 Tweak acknowledgements 2022-03-23 14:56:41 +00:00
20551152b3 Minor tweaks and typo fixes. 2022-03-21 14:12:59 +00:00
8679803146 Fix typo 2022-03-18 14:49:58 +00:00
d7bd881a00 Update latest draft 2021-12-22 16:55:21 +00:00
f5685fe70d Chapter 8 2021-12-22 16:48:14 +00:00
7f3503153f Minor fixes 2021-12-22 16:27:14 +00:00
40c6505ae2 Simplify 2021-12-22 16:15:16 +00:00
b897751a38 Note on reduction relation 2021-12-22 16:13:22 +00:00
3e1bbf3206 Fix todo 2021-12-22 16:10:51 +00:00
40948507e9 CPS outline 2021-12-22 16:08:08 +00:00
2a800f07e2 WIP 2021-12-22 15:58:26 +00:00
d3921f24e3 WIP 2021-12-22 14:23:57 +00:00
7063acb4e7 Related work 2021-12-21 16:14:59 +00:00
c9ff1d9af8 Chapter 3 2021-12-21 16:05:12 +00:00
fff15c9c83 Section 2.6 and 2.7 2021-12-20 23:29:27 +00:00
a24a33dcf8 Section 2.5 2021-12-20 16:08:32 +00:00
6c128a1181 Section 2.4 2021-12-20 13:37:07 +00:00
98784c59ab Section 2.3 2021-12-17 17:57:31 +00:00
6492391ed4 Section 2.2 2021-12-17 17:23:01 +00:00
cea34c85e1 Section 2.1 2021-12-17 16:42:02 +00:00
40b1144d9b Chapter 2 outline, relation to prior work, and terminology. 2021-12-17 01:29:57 +00:00
3067bfb939 fix chapter 2 intro 2021-12-13 22:55:52 +00:00
83b5f7db99 Start implementing the corrections. 2021-11-24 15:20:50 +00:00
981b0d48f8 Update README with viva date. 2021-08-13 12:07:16 +01:00
ee8a4ab2dd Fix a couple of typos 2021-08-13 11:47:23 +01:00
3fda920eae Minor improvement 2021-08-13 11:35:08 +01:00
0b198e7a25 Add paper references 2021-08-12 23:01:29 +01:00
740413ed1b Viva slides 2021-08-12 22:37:01 +01:00
7ed7a44d61 Package the draft as an archive 2021-06-07 13:31:51 +01:00
350d741204 List appendices 2021-06-07 12:35:42 +01:00
f8697be4c7 Remark that the final revision will be made available. 2021-06-07 12:28:06 +01:00
f9b8234221 Link to examiners 2021-06-07 12:26:36 +01:00
67598cee1e Dissertation overview 2021-06-07 12:22:52 +01:00
113b7c4620 Update build instructions 2021-06-07 12:13:26 +01:00
c52edb51f6 Make the latest draft revision available. 2021-06-07 12:10:00 +01:00
a4b802e4e0 Draft compilation 2021-06-07 12:03:47 +01:00
3b7dd13e3d typo 2021-06-01 19:03:06 +01:00
a42bfc25ab Update acknowledgements 2021-06-01 18:35:26 +01:00
97a4a806e1 Fix typos 2021-05-31 10:26:35 +01:00
0e02128d03 Rewording. THANKS AGAIN AMNA. 2021-05-30 20:45:37 +01:00
aa2b963d0e Fix grammar 2021-05-30 20:41:03 +01:00
2f494aae67 Fix grammar 2021-05-30 20:40:16 +01:00
a36b1cf0d4 Another typo 2021-05-30 20:38:54 +01:00
53b54056f8 Fix typo - THANKS AMNA 2021-05-30 20:38:00 +01:00
f80becc368 Spell out anonymous function notation 2021-05-30 20:10:16 +01:00
6c6d8e2aba A little paragraph justifying CPS 2021-05-30 20:04:41 +01:00
bc7d89ec5f Update acknowledgements 2021-05-30 19:51:21 +01:00
69a2c881b7 Declaration signature 2021-05-30 13:43:43 +01:00
6e5d7b01df Acknowledgements 2021-05-30 13:40:48 +01:00
49e53bac03 Acknowledgements 2021-05-30 13:35:04 +01:00
4834a6e5d3 Final example 2021-05-30 13:09:00 +01:00
3f91ab595e Fix rendering of type erasure lemma 2021-05-30 01:01:48 +01:00
333452bed2 Remove todo 2021-05-30 00:58:08 +01:00
51429afdd8 Update related work Chapter 5 2021-05-30 00:56:43 +01:00
e52cc41d40 Dybvig et al. taxonomy 2021-05-29 23:57:24 +01:00
b2eb9334ca Fix wording 2021-05-29 20:36:51 +01:00
754c3b823e Appendices 2021-05-29 20:21:32 +01:00
363628c1d3 Consistency 2021-05-29 16:33:52 +01:00
664956251c another example 2021-05-29 16:02:19 +01:00
d18a5e3058 Syntactic sugar 2021-05-29 12:15:21 +01:00
00f4264547 Minor fix 2021-05-29 11:57:39 +01:00
5597c9657b Lay summary 2021-05-29 11:56:35 +01:00
8b3660b0ce WIP 2021-05-29 10:40:49 +01:00
77475e129b WIP 2021-05-29 00:30:25 +01:00
9c2da2c378 Fix typos in introduction 2021-05-29 00:28:38 +01:00
ee92e3b483 WIP 2021-05-28 22:54:30 +01:00
6c3eb0e9cf another example 2021-05-28 19:41:29 +01:00
a476679810 Another example 2021-05-28 19:03:55 +01:00
3cb5e3622f Example 2021-05-28 18:20:01 +01:00
11b4888263 WIP 2021-05-28 13:19:54 +01:00
68110a67ef missing macros 2021-05-28 12:49:36 +01:00
d4ce54795c Minor fixes 2021-05-28 12:21:14 +01:00
2fbbf04bd4 WIP 2021-05-28 10:51:07 +01:00
0885c75c1e WIP 2021-05-28 01:09:53 +01:00
0c4108cdea WIP 2021-05-28 00:11:34 +01:00
4259ddee4d WIP 2021-05-28 00:07:19 +01:00
5340615c26 WIP 2021-05-28 00:00:00 +01:00
28fd0505ce Asymptotic notation and other fixes 2021-05-27 19:35:06 +01:00
fe6444ff3d Theorem 8.9 2021-05-27 13:49:42 +01:00
9fa5ebe6eb Citation for the three state equations. 2021-05-27 13:15:30 +01:00
79735da80a WIP 2021-05-27 13:04:43 +01:00
75d0dac161 WIP 2021-05-27 11:47:47 +01:00
a7d5117a64 Row polymorphism 2021-05-27 10:50:31 +01:00
75eb07cee1 Typo 2021-05-27 00:57:03 +01:00
ccd1f59d57 WIP 2021-05-27 00:50:09 +01:00
e84b4605c2 WIP 2021-05-27 00:35:40 +01:00
a57ac855c2 Chapter 9 2021-05-26 23:46:57 +01:00
fac68ae974 WIP 2021-05-26 21:41:59 +01:00
a4d9cc4edd WIP 2021-05-26 21:41:09 +01:00
02b9a782f3 Typo 2021-05-26 10:30:55 +01:00
e419d52ee2 WIP 2021-05-26 10:28:44 +01:00
98c79cc70d minor consistency fixes 2021-05-26 01:55:52 +01:00
2c51620a56 WIP 2021-05-26 01:15:07 +01:00
0f31e10582 WIP 2021-05-26 01:07:20 +01:00
9679a3cc82 WIP 2021-05-26 01:02:20 +01:00
559d9c2d37 CLR 2021-05-26 01:02:14 +01:00
5c835f5179 Fiddling with tikz 2021-05-25 21:08:30 +01:00
836d85ea99 Break up tables 2021-05-25 20:18:52 +01:00
622932494d Fix typos 2021-05-25 19:28:17 +01:00
111b4cb35a Update 2021-05-25 14:35:51 +01:00
6f44524750 WIP 2021-05-25 13:28:10 +01:00
3438581826 Reword 2021-05-25 13:03:22 +01:00
650de85238 Effect sugar 2021-05-25 12:59:01 +01:00
b47c60fe57 WIP 2021-05-25 01:19:48 +01:00
696266922a WIP 2021-05-25 00:20:51 +01:00
8fad146499 Note on higher order functions 2021-05-24 18:51:40 +01:00
93793648ef Introduction draft 2021-05-24 15:28:02 +01:00
d9717b7434 Draft introdoctury bit 2021-05-24 14:15:58 +01:00
7c3942a564 WIP 2021-05-24 11:49:38 +01:00
a462aa8a57 WIP 2021-05-24 01:48:25 +01:00
13d76a146b Update state of effectful programming 2021-05-23 22:42:28 +01:00
67a48945e9 Insert a few citations. 2021-05-23 18:48:14 +01:00
b73d9a213f More proper capitalisations 2021-05-23 18:47:58 +01:00
475f82324d Extend acknowledgements 2021-05-23 18:43:33 +01:00
6f8c5364f2 Correct capitalisation 2021-05-23 18:43:24 +01:00
0e2015485a Update acknowledgements 2021-05-23 18:24:44 +01:00
7ec90b216d Fix typos in abstract 2021-05-23 17:26:03 +01:00
35af9ba572 State of effectful programming 2021-05-23 16:26:08 +01:00
a3273afa50 Combining monads 2021-05-23 15:33:28 +01:00
1945a7307c Yallop's thesis 2021-05-23 14:12:35 +01:00
307e4bd259 Fix typo 2021-05-23 11:44:30 +01:00
114252b64f Scope 2021-05-23 11:36:24 +01:00
21fba05959 Other theses 2021-05-23 02:41:26 +01:00
a41fb391fc Update code 2021-05-22 20:33:28 +01:00
85757c48fd Effect handlers primer 2021-05-22 20:08:12 +01:00
28b8503b97 WIP 2021-05-22 01:22:47 +01:00
2c63d11392 WIP 2021-05-22 00:29:13 +01:00
c254d293a9 fix typos 2021-05-21 18:51:24 +01:00
eefa6e4ad4 Monadic reflection example 2021-05-21 14:02:06 +01:00
8cc91fa4b1 WIP 2021-05-20 18:03:38 +01:00
15125f206c Intro WIP 2021-05-20 17:49:38 +01:00
ef04653ad2 WIP 2021-05-20 14:41:25 +01:00
1ede601435 Mention equations 2021-05-20 11:22:22 +01:00
9e7c74ef0f Reword 2021-05-20 11:17:47 +01:00
d1a91fb197 Reword 2021-05-20 11:04:54 +01:00
76d9c00e19 Free monad section 2021-05-20 11:03:43 +01:00
d00227a57b WIP 2021-05-20 01:04:44 +01:00
e46cd37b01 WIP 2021-05-20 00:21:26 +01:00
26b12c123a Transparent state-passing 2021-05-19 21:16:49 +01:00
a3e97f9510 WIP 2021-05-19 19:26:32 +01:00
09cd57fbce Builtin state intro 2021-05-19 19:18:28 +01:00
5981ac986c WIP 2021-05-19 18:47:55 +01:00
a46e2fd5d6 WIP 2021-05-19 18:11:36 +01:00
4ece98ba21 State example with delimited control 2021-05-19 17:49:50 +01:00
a609ca4b81 WIP 2021-05-19 11:16:22 +01:00
d0061e18c2 WIP 2021-05-18 23:54:35 +01:00
c28aef1c9e Notes on why first-class control matters 2021-05-18 23:45:20 +01:00
8ecfadb94e Fix Ref macro 2021-05-18 08:04:20 +01:00
52b12535ae WIP 2021-05-17 23:28:51 +01:00
bce45f10e3 fix typo 2021-05-17 23:20:32 +01:00
1129d2bb71 WIP 2021-05-17 23:18:03 +01:00
9ba7def07b WIP 2021-05-17 23:13:01 +01:00
2eb5b0d4ba WIP 2021-05-15 21:08:57 +01:00
1c692d8cbf WIP 2021-05-15 13:29:49 +01:00
4d5bd3e08e Update conclusion 2021-05-13 23:35:05 +01:00
b13960a5e1 Fix spacing in stepsto type declaration 2021-05-13 13:30:02 +01:00
84fe38105e Contributions and outline 2021-05-13 11:07:36 +01:00
aacee4d72a WIP 2021-05-12 22:51:01 +01:00
1bca580f1f Reword conclusion 2021-05-11 23:04:15 +01:00
b02743df0f WIP 2021-05-11 11:18:30 +01:00
b76e18488c WIP 2021-05-10 23:44:12 +01:00
60976a7013 WIP 2021-05-10 16:26:08 +01:00
e88d27740d WIP 2021-05-06 22:39:08 +01:00
74c25ce63b Rewording and reordering 2021-05-06 10:47:25 +01:00
f9d92a231e Example done 2021-05-05 23:17:43 +01:00
50125e86ac Example 2021-05-05 22:54:14 +01:00
d6b67950b2 WIP 2021-05-04 23:00:40 +01:00
fc0c6a98bb WIP 2021-05-03 22:39:19 +01:00
388dc36b20 WIP 2021-04-27 22:31:26 +01:00
61b2ce4f66 Realisability 2021-04-26 23:22:48 +01:00
08b107323d WIP 2021-04-23 13:42:55 +01:00
1a93d1a5b7 Conclusions notes [WIP] 2021-04-20 22:47:50 +01:00
febf2a06c0 Abstract machine correctness 2021-04-20 21:48:20 +01:00
0861e926ee abstract machine related work 2021-04-20 16:31:34 +01:00
9f5b2ba56c WIP 2021-04-13 23:54:11 +01:00
78e291d602 WIP 2021-04-13 00:38:09 +01:00
d8ac28a9ee Abstract machine WIP 2021-04-12 14:04:01 +01:00
817676f8e8 Edits 2021-04-10 18:47:49 +01:00
4c480a4b6e Abstract machine figures 2021-04-09 00:04:58 +01:00
408b6041f6 WIP 2021-04-07 21:17:26 +01:00
950bee7ce3 Fix typos in chapter 9 2021-04-07 11:59:05 +01:00
25b48c1082 Reword 2021-04-05 19:28:49 +01:00
0cd953ac94 Interdefinability of effect handlers 2021-04-05 17:11:15 +01:00
34d724919f WIP 2021-03-31 22:39:07 +01:00
2f7da6ed15 WIP 2021-03-29 23:46:16 +01:00
5f7e8eadd2 Prove lemma 2021-03-18 00:42:06 +00:00
284139375a Interdefinability WIP2 2021-03-16 23:58:14 +00:00
28aaebf5ec WIP 2021-03-16 00:10:59 +00:00
f1d88fbcc4 Interdefinability WIP 2021-03-15 23:40:25 +00:00
669b708a79 Related work for CPS 2021-03-15 14:38:35 +00:00
df08169725 Administrative resumptions example. 2021-03-12 18:39:06 +00:00
b609812079 CPS intro 2021-03-12 00:18:08 +00:00
1b2882b1eb Simplify CPS 2021-03-04 11:56:45 +00:00
7f99b18242 CPS for parameterised handlers 2021-03-03 22:41:00 +00:00
95035458ec CPS translation for parameterised handlers (figure) 2021-03-03 14:22:56 +00:00
a29a6dc9c5 CPS intro 2021-03-02 23:36:33 +00:00
bd3e2c8b9f Update related work 2021-02-24 22:12:50 +00:00
485d02f101 Merge branch 'master' of github.com:dhil/phd-dissertation 2021-02-17 19:33:53 +00:00
d890a327a7 Note 2021-02-17 19:33:48 +00:00
e9cd4315be Spacing. 2021-02-17 18:04:05 +00:00
f1e1b75ef7 Fix more typos 2021-02-17 18:02:49 +00:00
2f7a6ec818 More minor fixes 2021-02-17 17:52:13 +00:00
2b21cfcb4e Minor fixes 2021-02-17 17:49:34 +00:00
dd0aaa32f6 Fix typos 2021-02-17 17:39:40 +00:00
6588c0581c idiom => saying 2021-02-17 17:27:05 +00:00
12e24d7051 Minor edits 2021-02-15 15:50:59 +00:00
ace6a5b37c Local/global state 2021-02-15 15:42:54 +00:00
7917c2ca0b Abstract 2021-02-11 21:15:29 +00:00
b8fd8ea43d Update abstract 2021-02-11 11:11:40 +00:00
617fd1112c Update parameterised example. 2021-02-10 18:34:16 +00:00
cf2422a312 citet => cite 2021-02-08 16:13:13 +00:00
9959b211e4 Bits and edits 2021-02-08 15:01:29 +00:00
d128895361 Some related work 2021-02-05 12:30:13 +00:00
b977c35d91 typo 2021-02-05 01:05:47 +00:00
e907a526e5 More related work 2021-02-05 01:04:50 +00:00
5560b73cc5 note 2021-02-04 23:24:07 +00:00
afb7c4b5cb Related work 2021-02-04 23:23:21 +00:00
9f83249765 Parameterised handlers section. 2021-02-04 18:18:27 +00:00
9ae478047d runNext 2021-02-04 16:28:32 +00:00
9fdcf19ee5 Parameterised semantics 2021-02-04 15:04:41 +00:00
86269f6de2 Process synchronisation code. 2021-02-04 12:14:06 +00:00
f6613484ca skeleton code 2021-02-04 00:25:50 +00:00
756ce77e5a Edits 2021-02-03 22:29:38 +00:00
33781a94e2 Start parameterised handlers. 2021-02-03 22:26:47 +00:00
9fc66e6b62 Frequency 2021-02-03 18:04:15 +00:00
9dcac3cf29 Filters 2021-02-03 16:07:36 +00:00
ebca80d4b7 Pipes 2021-02-02 23:56:33 +00:00
fa823432ed Shallow handlers intro 2021-02-02 15:26:59 +00:00
e5bc7f52b9 Update references 2021-02-01 17:43:34 +00:00
a4b3053d17 Shallow handlers intro 2021-02-01 16:00:24 +00:00
3fa47f2ae6 Summary 2021-02-01 13:50:26 +00:00
eea76a0979 File linking/unlinking. 2021-01-26 23:48:43 +00:00
a34a2c9775 File linking 2021-01-22 20:57:36 +00:00
5c2e028445 File linking and unlinking skeletons 2021-01-21 23:36:48 +00:00
83769bf406 Stream redirection 2021-01-21 21:14:49 +00:00
5668c2be45 WIP 2021-01-18 22:53:03 +00:00
3cd12d216d File system WIP 2021-01-14 20:00:46 +00:00
46e36b5318 Chap 6 rewrite WIP 2021-01-14 16:13:00 +00:00
7e71992709 WIP 2021-01-12 23:09:20 +00:00
dbc52adcdc Chapter 6 intro. 2021-01-11 22:41:17 +00:00
17 changed files with 29187 additions and 7455 deletions

View File

@@ -3,8 +3,10 @@ CFLAGS=-interaction=nonstopmode -halt-on-error -file-line-error
BIBC=bibtex
PAPER=thesis
BIBLIO=$(PAPER)
LATEST_COMMIT=$(shell git log --format="%h" -n 1)
all: $(PAPER).pdf
draft: $(PAPER).pdf-draft
$(PAPER).aux: $(PAPER).tex
$(TEXC) $(CFLAGS) $(PAPER)
@@ -16,6 +18,11 @@ $(PAPER).pdf: $(PAPER).aux $(BIBLIO).bbl
$(TEXC) $(CFLAGS) $(PAPER)
$(TEXC) $(CFLAGS) $(PAPER)
$(PAPER).pdf-draft: CFLAGS:=$(CFLAGS) "\def\DRAFT{$(LATEST_COMMIT)}\input{$(PAPER)}"
$(PAPER).pdf-draft: all
mv $(PAPER).pdf $(PAPER)-draft.pdf
tar cf thesis-draft.tar.gz $(PAPER)-draft.pdf
clean:
rm -f *.log *.aux *.toc *.out
rm -f *.bbl *.blg *.fls *.xml

120
README.md
View File

@@ -1,6 +1,120 @@
# PhD dissertation on foundations for programming and implementing effect handlers
# Foundations for programming and implementing effect handlers
A copy of my dissertation can be [downloaded via my
website](https://dhil.net/research/papers/thesis.pdf).
----
Submitted on May 30, 2021. Examined on August 13, 2021.
The board of examiners were
* [Andrew Kennedy](https://github.com/andrewjkennedy) (Facebook London)
* [Edwin Brady](https://www.type-driven.org.uk/edwinb/) (University of St Andrews)
* [Ohad Kammar](http://denotational.co.uk/) (The University of Edinburgh)
* [Stephen Gilmore](https://homepages.inf.ed.ac.uk/stg/) (The University of Edinburgh)
## Thesis structure
The dissertation is structured as follows.
### Introduction
* Chapter 1 puts forth an argument for why effect handlers
matter. Following this argument it provides a basic introduction to
several different approaches to effectful programming through the
lens of the state effect. In addition, it also declares the scope
and contributions of the dissertation, and discusses some related
work.
### Programming
* Chapter 2 illustrates effect handler oriented programming by
example by implementing a small operating system dubbed Tiny UNIX,
which captures some essential traits of Ritchie and Thompson's
UNIX. The implementation starts with a basic notion of file i/o,
and then, it evolves into a feature-rich operating system with full
file i/o, multiple user environments, multi-tasking, and more, by
composing ever more effect handlers.
* Chapter 3 introduces a polymorphic fine-grain call-by-value core
calculus, λ<sub>b</sub>, which makes key use of Rémy-style row
polymorphism to implement polymorphic variants, structural records,
and a structural effect system. The calculus distils the essence of
the core of the Links programming language. The chapter also
presents three extensions of λ<sub>b</sub>, which are λ<sub>h</sub>
that adds deep handlers, λ<sup>†</sup> that adds shallow handlers,
and λ<sup>‡</sup> that adds parameterised handlers.
### Implementation
* Chapter 4 develops a higher-order continuation passing style
translation for effect handlers through a series of step-wise
refinements of an initial standard continuation passing style
translation for λ<sub>b</sub>. Each refinement slightly modifies
the notion of continuation employed by the translation. The
development ultimately leads to the key invention of generalised
continuation, which is used to give a continuation passing style
semantics to deep, shallow, and parameterised handlers.
* Chapter 5 demonstrates an application of generalised continuations
to abstract machine as we plug generalised continuations into
Felleisen and Friedman's CEK machine to obtain an adequate abstract
runtime with simultaneous support for deep, shallow, and
parameterised handlers.
### Expressiveness
* Chapter 6 shows that deep, shallow, and parameterised notions of
handlers can simulate one another up to specific notions of
administrative reduction.
* Chapter 7 studies the fundamental efficiency of effect handlers. In
this chapter, we show that effect handlers enable an asymptotic
improvement in runtime complexity for a certain class of
functions. Specifically, we consider the *generic count* problem
using a pure PCF-like base language λ<sub>b</sub><sup>→</sup> (a
simply typed variation of λ<sub>b</sub>) and its extension with
effect handlers λ<sub>h</sub><sup>→</sup>. We show that
λ<sub>h</sub><sup>→</sup> admits an asymptotically more efficient
implementation of generic count than any λ<sub>b</sub><sup>→</sup>
implementation.
### Conclusions
* Chapter 8 concludes and discusses future work.
### Appendices
* Appendix A contains a literature survey of continuations and
first-class control. I classify continuations according to their
operational behaviour and provide an overview of the various
first-class sequential control operators that appear in the
literature. The application spectrum of continuations is discussed
as well as implementation strategies for first-class control.
* Appendix B contains a proof that shows the `Get-get` equation for
state is redundant.
* Appendix C contains the proof details and gadgetry for the
complexity of the effectful generic count program.
* Appendix D provides a sample implementation of the Berger count
program and discusses it in more detail.
## Building
To build the dissertation you need the [Informatics thesis LaTeX
class](https://github.com/dhil/inf-thesis-latex-cls).
class](https://github.com/dhil/inf-thesis-latex-cls) with the
University of Edinburgh crests. Invoking `make` on the command line
ought to produce a PDF copy of the dissertation named `thesis.pdf`,
e.g.
Don't hold your breath... This thing isn't due for a while...
```shell
$ make
```
## Timeline
I submitted my thesis on May 30, 2021. It was examined on August 13,
2021, where I received pass with minor corrections. The revised thesis
was submitted on December 22, 2021. It was approved on March
14, 2022. The final revision was submitted on March 23, 2022. I
received my PhD award letter on March 24, 2022. My graduation
ceremony took place in McEwan Hall on July 11, 2022.

124
code/State.hs Normal file
View File

@@ -0,0 +1,124 @@
{- A Haskell version of the companion code for "State of effectful programming".
Tested with GHCi 8.6.5. -}
import Control.Monad.ST (runST)
import Data.STRef (newSTRef, readSTRef, writeSTRef)
-- State monad
newtype State s a = State { runState :: s -> (a,s) }
-- | State is a functor
instance Functor (State s) where
fmap f m = State (\st -> let (x, st') = runState m st in
(f x, st'))
-- | State is an applicative functor
instance Applicative (State s) where
pure x = State (\st -> (x, st))
m1 <*> m2 = State (\st -> let (f, st') = runState m1 st in
runState (fmap f m2) st')
-- | State is a monad
instance Monad (State s) where
return = pure
m >>= k = State (\st -> let (x, st') = runState m st in
runState (k x) st')
-- | State operations
get :: () -> State s s
get () = State (\st -> (st, st))
put :: s -> State s ()
put st = State (\st' -> ((), st))
-- Continuation monad
newtype Cont r a = Cont { runCont :: (a -> r) -> r }
-- | Cont is a functor
instance Functor (Cont r) where
fmap f k = Cont (\g -> runCont k (\x -> g (f x)))
-- | Cont is an applicative functor
instance Applicative (Cont r) where
pure x = Cont (\k -> k x)
k <*> k' = Cont (\r -> runCont k
(\k'' -> runCont k'
(\x -> r (k'' x))))
-- | Cont is a monad
instance Monad (Cont r) where
return = pure
m >>= k = Cont (\k' -> runCont m
(\x -> runCont (k x)
(\y -> k' y)))
-- | State operations
getk :: () -> Cont (State s a) s
getk () = Cont (\k -> State (\st -> runState (k st) st))
putk :: s -> Cont (State s a) ()
putk st' = Cont (\k -> State (\st -> runState (k ()) st'))
-- Free monad
data Free f a = Return a
| Op (f (Free f a))
-- | Free is a functor
instance Functor f => Functor (Free f) where
fmap f (Return x) = Return (f x)
fmap f (Op y) = Op (fmap (fmap f) y)
-- | Free is an applicative functor
instance Functor f => Applicative (Free f) where
pure = Return
(Return f) <*> xs = fmap f xs
(Op f) <*> xs = Op (fmap (\g -> g <*> xs) f)
-- | Free is a monad
instance Functor f => Monad (Free f) where
return = Return
(Return x) >>= k = k x
(Op y) >>= k = Op (fmap (\m' -> m' >>= k) y)
-- | Auxiliary function for constructing operation nodes
do' :: Functor f => f a -> Free f a
do' op = Op (fmap Return op)
-- Instantiate Free with state
data FreeState s r = Get (s -> r)
| Put s (() -> r)
-- | FreeState is a functor
instance Functor (FreeState s) where
fmap f (Get k) = Get (\st -> f (k st))
fmap f (Put st' k) = Put st' (\() -> f (k ()))
-- | State operations
get' :: () -> Free (FreeState s) s
get' () = do' (Get (\x -> x))
put' :: s -> Free (FreeState s) ()
put' st = do' (Put st (\() -> ()))
-- | State handler
runState' :: s -> Free (FreeState s) a -> (a, s)
runState' st0 (Op (Get k)) = runState' st0 (k st0)
runState' st0 (Op (Put st k)) = runState' st (k ())
runState' st0 (Return x) = (x, st0)
-- Generic state example
incrEven :: Monad m => (() -> m Int, Int -> m ()) -> () -> m Bool
incrEven (get, put) () = get () >>= (\st -> put (1 + st) >>= (\() -> return (even st)))
runExamples :: Int -> [(String, (Bool, Int))]
runExamples st0 = map (\(s, f) -> (s, f st0)) examples
where examples = [ ("builtin state", \st -> runST $ do
st' <- newSTRef st
v <- readSTRef st'
writeSTRef st' (v + 1)
v' <- readSTRef st'
return (even v, v'))
, ("pure state passing", \st -> (even st, st + 1))
, ("state monad", \st -> runState (incrEven (get, put) ()) st)
, ("continuation monad", \st -> runState (runCont (incrEven (getk, putk) ())
(\x -> State (\st -> (x, st)))) st)
, ("free monad", \st -> runState' st (incrEven (get', put') ())) ]

1469
code/ehop2022.links Normal file

File diff suppressed because it is too large Load Diff

396
code/state.ml Normal file
View File

@@ -0,0 +1,396 @@
(* Companion for "State of effectful programming"
Tested with OCaml 4.10.0+multicore. *)
(* Generic direct-style incr_even *)
let even : int -> bool
= fun n -> n mod 2 = 0
let incr_even : (unit -> int) * (int -> unit) -> unit -> bool
= fun (get, put) () ->
let st = get () in
put (1 + st);
even st
(* Delimited control *)
module Prompt : sig
type 'a t
val make : unit -> 'a t
val reify : 'a t -> (('b -> 'a) -> 'a) -> 'b
val install : 'a t -> (unit -> 'a) -> 'a
end = struct
type 'a t = {
install : (unit -> 'a) -> 'a;
reify : 'b. (('b -> 'a) -> 'a) -> 'b
}
let make (type a) () =
let module M = struct
effect Prompt : (('b -> a) -> a) -> 'b
end
in
let reify f = perform (M.Prompt f) in
let install f =
match f () with
| x -> x
| effect (M.Prompt f) k -> f (continue k)
in
{ install; reify }
let install { install; _ } = install
let reify { reify; _ } = reify
let resume k v = continue k v
end
module type CTRL = sig
type ans
val reset : (unit -> ans) -> ans
val shift : (('a -> ans) -> ans) -> 'a
end
module Ctrl(R : sig type ans end) : sig
include CTRL with type ans = R.ans
end = struct
type ans = R.ans
let p : ans Prompt.t = Prompt.make ()
let reset m =
Prompt.install p m
let shift f =
Prompt.reify p
(fun k ->
Prompt.install p
(fun () ->
f (fun x ->
Prompt.install p
(fun () -> k x))))
end
module CtrlState
(S : sig type s end)
(R : sig type ans end): sig
type s = S.s
type ans = s -> R.ans * s
val get : unit -> s
val put : s -> unit
val run : (unit -> R.ans) -> ans
end = struct
type s = S.s
type ans = s -> R.ans * s
module Ctrl = Ctrl(struct type nonrec ans = ans end)
let get () = Ctrl.shift (fun k -> fun st -> k st st)
let put st' = Ctrl.shift (fun k -> fun st -> k () st')
let run m =
Ctrl.reset
(fun () ->
let x = m () in
fun st -> (x, st))
end
module CtrlIntState = CtrlState(struct type s = int end)(struct type ans = bool end)
(* Monadic programming *)
module type MONAD = sig
type 'a t
val return : 'a -> 'a t
val (>>=) : 'a t -> ('a -> 'b t) -> 'b t
end
(** State monad **)
module type STATE_MONAD = sig
type ans
type s
include MONAD
val get : unit -> s t
val put : s -> unit t
val run : (unit -> ans t) -> s -> ans * s
end
module StateMonad(S : sig type s end)(R : sig type ans end): sig
include STATE_MONAD with type s = S.s
and type ans = R.ans
end = struct
type ans = R.ans
type s = S.s
type 'a t = s -> 'a * s
let return : 'a -> 'a t
= fun x -> fun st -> (x, st)
let (>>=) : 'a t -> ('a -> 'b t) -> 'b t
= fun m k -> fun st ->
let (x, st') = m st in
k x st'
let get : unit -> s t
= fun () st -> (st, st)
let put : s -> unit t
= fun st st' -> ((), st)
let run : (unit -> ans t) -> s -> ans * s
= fun m st -> m () st
end
module IntStateMonad = StateMonad(struct type s = int end)(struct type ans = bool end)
(** Continuation monad **)
module type CONTINUATION_MONAD = sig
type r
include MONAD with type 'a t = ('a -> r) -> r
end
module ContinuationMonad(R : sig type ans end): sig
include CONTINUATION_MONAD with type r = R.ans
end = struct
type r = R.ans
type 'a t = ('a -> r) -> r
let return : 'a -> 'a t
= fun x -> fun k -> k x
let (>>=) : 'a t -> ('a -> 'b t) -> 'b t
= fun m k -> fun c ->
m (fun x -> k x c)
end
module ContinuationStateMonad
(S : sig type s end)
(R : sig type ans end): sig
type s = S.s
type ans = R.ans
include CONTINUATION_MONAD with type r = s -> ans * s
val get : unit -> s t
val put : s -> unit t
val run : (unit -> ans t) -> s -> ans * s
end = struct
type s = S.s
type ans = R.ans
module ContinuationMonad : CONTINUATION_MONAD with type r = s -> ans * s
= ContinuationMonad(struct type nonrec ans = s -> ans * s end)
include ContinuationMonad
let get : unit -> s t
= fun () -> fun k -> fun st -> k st st
let put : s -> unit t
= fun st' -> fun k -> fun st -> k () st'
let run : (unit -> R.ans t) -> s -> R.ans * s =
fun m st -> m () (fun x -> fun st -> (x, st)) st
end
module ContinuationIntStateMonad
= ContinuationStateMonad(struct type s = int end)(struct type ans = bool end)
(** Free monad **)
module type FUNCTOR = sig
type 'a t
val fmap : ('a -> 'b) -> 'a t -> 'b t
end
module type FREE_MONAD = sig
type 'a op
type 'a free = Return of 'a
| Op of 'a free op
include MONAD with type 'a t = 'a free
val do' : 'a op -> 'a free
end
module FreeMonad(F : FUNCTOR) : sig
include FREE_MONAD with type 'a op = 'a F.t
end = struct
type 'a op = 'a F.t
type 'a free = Return of 'a
| Op of 'a free F.t
type 'a t = 'a free
let return : 'a -> 'a t
= fun x -> Return x
let rec (>>=) : 'a t -> ('a -> 'b t) -> 'b t
= fun m k ->
match m with
| Return x -> k x
| Op y -> Op (F.fmap (fun m' -> m' >>= k) y)
let do' : 'a F.t -> 'a free
= fun op -> Op (F.fmap (fun x -> Return x) op)
end
module type FREE_STATE = sig
type s
type 'r opsig = Get of (s -> 'r)
| Put of s * (unit -> 'r)
include FUNCTOR with type 'r t = 'r opsig
end
module FreeState(S : sig type s end) = struct
type s = S.s
type 'r opsig = Get of (s -> 'r)
| Put of s * (unit -> 'r)
type 'r t = 'r opsig
let fmap : ('a -> 'b) -> 'a t -> 'b t
= fun f op ->
match op with
| Get k -> Get (fun st -> f (k st))
| Put (st', k) -> Put (st', fun st -> f (k ()))
end
module FreeIntStateMonad: sig
include STATE_MONAD with type s = int
and type ans = bool
end = struct
module rec FreeIntState : FREE_STATE with type s = int
= FreeState(struct type s = int end)
and FreeIntStateMonad : FREE_MONAD with type 'r op = 'r FreeIntState.opsig
= FreeMonad(FreeIntState)
open FreeIntState
include FreeIntStateMonad
type s = int
type ans = bool
let get : unit -> s t
= fun () -> do' (Get (fun st -> st))
let put : s -> unit t
= fun st -> do' (Put (st, fun () -> ()))
let rec run : (unit -> ans t) -> s -> ans * s
= fun m st ->
match m () with
| Return x -> (x, st)
| Op (Get k) -> run (fun () -> k st) st
| Op (Put (st', k)) -> run k st'
end
(** Monadic reflection **)
module Reflect
(M : MONAD)
(R : sig type ans end): sig
type ans = R.ans
val reify : (unit -> ans) -> ans M.t
val reflect : 'a M.t -> 'a
end = struct
type ans = R.ans
effect Reflect : 'a M.t -> 'a
let reify : (unit -> ans) -> ans M.t
= fun f ->
let open M in
match f () with
| x -> return x
| effect (Reflect m) k -> m >>= (continue k)
let reflect : 'a M.t -> 'a
= fun m ->
perform (Reflect m)
end
module ReflectIntStateMonad
= Reflect(IntStateMonad)(struct type ans = bool end)
module ReflectIntState = struct
open ReflectIntStateMonad
let get : unit -> int
= fun () -> reflect (IntStateMonad.get ())
let put : int -> unit
= fun st -> reflect (IntStateMonad.put st)
let run : (unit -> bool) -> int -> bool * int
= fun m st -> IntStateMonad.run (fun () -> reify m) st
end
(* Generic monadic incr_even *)
module MonadExample(T : STATE_MONAD with type s = int) = struct
let incr_even : unit -> bool T.t
= fun () ->
let open T in
(get ()) >>= (fun st -> put (1 + st)
>>= (fun () -> return (even st)))
end
(** Effect handlers **)
module type STATE_HANDLER = sig
type s
val get : unit -> s
val put : s -> unit
val run : (unit -> 'a) -> s -> 'a * s
end
module StateHandler(S : sig type s end) : STATE_HANDLER with type s = S.s = struct
type s = S.s
effect Put : s -> unit
let put st = perform (Put st)
effect Get : unit -> s
let get () = perform (Get ())
let run
= fun m st ->
let f = match m () with
| x -> (fun st -> (x, st))
| effect (Put st') k -> (fun st -> continue k () st')
| effect (Get ()) k -> (fun st -> continue k st st)
in f st
end
module IntStateHandler = StateHandler(struct type s = int end)
let run_examples () =
let examples = [
"builtin", (fun st ->
let st = ref st in let v = !st in st := 1 + v; (even v, !st));
"pure state passing", (fun st -> (even st, 1 + st));
"shift/reset", (fun st ->
CtrlIntState.run (incr_even CtrlIntState.(get, put)) st);
"state monad", (fun st ->
let module MonadStateExample = MonadExample(IntStateMonad) in
IntStateMonad.run MonadStateExample.incr_even st);
"continuation monad", (fun st ->
let module ContinuationMonadExample = MonadExample(ContinuationIntStateMonad) in
ContinuationIntStateMonad.run ContinuationMonadExample.incr_even st);
"free monad", (fun st ->
let module FreeMonadExample = MonadExample(FreeIntStateMonad) in
FreeIntStateMonad.run FreeMonadExample.incr_even st);
"monadic reflection", (fun st ->
ReflectIntState.run (incr_even ReflectIntState.(get, put)) st);
"state handler", (fun st ->
IntStateHandler.run (incr_even IntStateHandler.(get, put)) st) ]
in
List.map (fun (s, f) -> (s, f 4)) examples
(* module IntStateMRefl : MREFL with type ans := bool and type 'a t = 'a IntState.t
* = MRefl(struct type ans = bool end)(IntState)
*
* let get () = IntStateMRefl.reflect (IntState.get ())
* let put st = IntStateMRefl.reflect (IntState.put st)
* let run m st = IntState.run (IntStateMRefl.reify m) st
*
* let even : int -> bool
* = fun n -> n mod 2 = 0
*
* let incr_even : unit -> bool
* = fun () ->
* let st = get () in
* put (1 + st);
* even st *)

1352
code/unix-huawei2022.links Normal file

File diff suppressed because it is too large Load Diff

1372
code/unix-msr2022.links Normal file

File diff suppressed because it is too large Load Diff

1352
code/unix-nuprl2022.links Normal file

File diff suppressed because it is too large Load Diff

1393
code/unix-tutorial.links Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -45,8 +45,6 @@ module Queue {
fun singleton(x) { enqueue(x, empty) }
}
##
## Environment
##
@@ -106,6 +104,27 @@ fun usermgr(user, envs, m) {
## Basic IO
##
typename FileDescr = Int;
typename FileCursor = Int;
module File {
typename T = [String];
sig empty : T
var empty = [];
sig read : (FileCursor, T) ~> Option(String)
fun read(start, file) {
switch (drop(start, file)) {
case [] -> None
case x :: _ -> Some(x)
}
}
sig write : (String, FileCursor, T) ~> T
fun write(contents, fptr, file) {
take(fptr, file) ++ [contents] ++ drop(fptr, file)
}
}
sig stdout : FileDescr
var stdout = 1;
@@ -113,7 +132,7 @@ var stdout = 1;
sig puts : (FileDescr,String) {Puts:(FileDescr,String) -> () |_}-> ()
fun puts(fd, s) { do Puts(fd, s) }
sig basicIO : (Comp(a, {Puts:(FileDescr,String) -> () |e})) {Puts{_} |e}~> [String]
sig basicIO : (Comp(a, {Puts:(FileDescr,String) -> () |e})) {Puts{_} |e}~> File.T
fun basicIO(m) {
handle(m()) {
case Return(_) -> []
@@ -121,8 +140,6 @@ fun basicIO(m) {
}
}
# TODO: implement file space.
##
## Generic state handling.
##
@@ -153,118 +170,125 @@ var stderr = 2;
sig eof : String
var eof = "\x00";
sig gets : (FileDescr) {Gets:(FileDescr) -> String |_}-> String
fun gets(fd) { do Gets(fd) }
typename Mode = [|Read|Write|];
typename Mode = [|Create|Append|];
typename FileDescr = Int;
typename INode = (loc:Option(Int),refc:Int);
sig fopen : (Mode, String) {Fopen:(Mode, String) -> FileDescr |_}-> FileDescr
fun fopen(mode, filename) { do Fopen(mode, filename) }
typename INodeTable = [(INode, File.T)];
typename FileTable = [(Mode, INode)];
typename
sig fclose : (FileDescr) {Fclose:(FileDescr) -> () |_}-> ()
fun fclose(fd) { do Fclose(fd) }
# sig gets : (FileDescr) {Gets:(FileDescr) -> String |_}-> String
# fun gets(fd) { do Gets(fd) }
typename File = Queue.T(String);
# sig fopen : (Mode, String) {Fopen:(Mode, String) -> FileDescr |_}-> FileDescr
# fun fopen(mode, filename) { do Fopen(mode, filename) }
sig emptyFile : File
var emptyFile = Queue.empty;
# sig fclose : (FileDescr) {Fclose:(FileDescr) -> () |_}-> ()
# fun fclose(fd) { do Fclose(fd) }
sig writeFile : (String, File) -> File
fun writeFile(s, file) { Queue.enqueue(s, file) }
# typename File = Queue.T(String);
sig readFile : (File) ~> (String, File)
fun readFile(file) {
switch (Queue.dequeue(file)) {
case (None, file) -> (eof, file)
case (Some(s), file) -> (s, file)
}
}
# sig emptyFile : File
# var emptyFile = Queue.empty;
typename FileTable = [(FileDescr, File)];
typename FileStore = [(String, FileDescr)];
typename FileSystem = (next:Int,ft:FileTable,fs:FileStore);
# sig writeFile : (String, File) -> File
# fun writeFile(s, file) { Queue.enqueue(s, file) }
sig defaultFileSystem : () -> FileSystem
fun defaultFileSystem() {
var defaultTable = [ (stdin , emptyFile)
, (stdout, emptyFile)
, (stderr, emptyFile) ];
# sig readFile : (File) ~> (String, File)
# fun readFile(file) {
# switch (Queue.dequeue(file)) {
# case (None, file) -> (eof, file)
# case (Some(s), file) -> (s, file)
# }
# }
var defaultStore = [ ("stdin" , stdin)
, ("stdout", stdout)
, ("stderr", stderr) ];
# typename FileTable = [(FileDescr, File)];
# typename FileStore = [(String, FileDescr)];
# typename FileSystem = (next:Int,ft:FileTable,fs:FileStore);
(next=3,ft=defaultTable,fs=defaultStore)
}
# sig defaultFileSystem : () -> FileSystem
# fun defaultFileSystem() {
# var defaultTable = [ (stdin , emptyFile)
# , (stdout, emptyFile)
# , (stderr, emptyFile) ];
sig lookupFile : (FileDescr, FileSystem) ~> File
fun lookupFile(fd, fsys) {
switch (lookup(fd, fsys.ft)) {
case Nothing -> error("err: No such file(" ^^ intToString(fd) ^^ ")")
case Just(file) -> file
}
}
# var defaultStore = [ ("stdin" , stdin)
# , ("stdout", stdout)
# , ("stderr", stderr) ];
sig replaceFile : (FileDescr, File, FileSystem) ~> FileSystem
fun replaceFile(fd, file, fsys) {
var ft = modify(fd, file, fsys.ft);
(fsys with ft = ft) # TODO handle nonexistent file.
}
# (next=3,ft=defaultTable,fs=defaultStore)
# }
sig createFile : (String, FileSystem) -> (FileDescr, FileSystem)
fun createFile(filename, fsys) {
var fd = fsys.next;
(fd, (next = fd + 1, fs = (filename, fd) :: fsys.fs, ft = (fd, emptyFile) :: fsys.ft))
}
# sig lookupFile : (FileDescr, FileSystem) ~> File
# fun lookupFile(fd, fsys) {
# switch (lookup(fd, fsys.ft)) {
# case Nothing -> error("err: No such file(" ^^ intToString(fd) ^^ ")")
# case Just(file) -> file
# }
# }
sig openFile : (Mode, String, FileSystem) ~> (FileDescr, FileSystem)
fun openFile(mode, filename, fsys) {
var (fd, fsys') = switch (lookup(filename, fsys.fs)) {
case Nothing -> createFile(filename, fsys)
case Just(fd) -> (fd, fsys)
};
switch (mode) {
case Create -> error("erase")
case Append -> (fd, fsys')
}
}
# sig replaceFile : (FileDescr, File, FileSystem) ~> FileSystem
# fun replaceFile(fd, file, fsys) {
# var ft = modify(fd, file, fsys.ft);
# (fsys with ft = ft) # TODO handle nonexistent file.
# }
sig closeFile : (File) ~> File
fun closeFile((=front,=rear)) {
(front=front ++ reverse(rear), rear=[])
}
# sig createFile : (String, FileSystem) -> (FileDescr, FileSystem)
# fun createFile(filename, fsys) {
# var fd = fsys.next;
# (fd, (next = fd + 1, fs = (filename, fd) :: fsys.fs, ft = (fd, emptyFile) :: fsys.ft))
# }
sig allowState : (() {Get-,Put- |e}~> a) -> () {Get:s,Put:(s) -> () |e}~> a
fun allowState(f) { (f : (() {Get:s,Put:(s) -> () |e}~> a) <- (() {Get-,Put- |e}~> a)) }
# sig openFile : (Mode, String, FileSystem) ~> (FileDescr, FileSystem)
# fun openFile(mode, filename, fsys) {
# var (fd, fsys') = switch (lookup(filename, fsys.fs)) {
# case Nothing -> createFile(filename, fsys)
# case Just(fd) -> (fd, fsys)
# };
# switch (mode) {
# case Create -> error("erase")
# case Append -> (fd, fsys')
# }
# }
sig fileIO : (Comp(a, {Get-,Put-,Gets:(FileDescr) -> String,Puts:(FileDescr,String) -> (),Fclose:(FileDescr) -> (),Fopen:(Mode,String) -> FileDescr |e})) {Get:() {}-> FileSystem,Put:(FileSystem) -> (),Gets{_},Puts{_},Fclose{_},Fopen{_} |e}~> a
fun fileIO(m) {
handle(allowState(m)()) {
case Gets(fd, resume) ->
var fsys = get();
var (ch, file) = readFile(lookupFile(fd, fsys));
put(replaceFile(fd, file, fsys)); resume(ch)
case Puts(fd, ch, resume) ->
var fsys = get();
var fsys' = replaceFile(fd, writeFile(ch, lookupFile(fd, fsys)), fsys);
put(fsys'); resume(())
case Fopen(mode, filename, resume) ->
var fsys = get();
var (fd, fsys') = openFile(mode, filename, fsys);
put(fsys'); resume(fd)
case Fclose(fd, resume) ->
var fsys = get();
var fsys' = replaceFile(fd, closeFile(lookupFile(fd, fsys)), fsys);
put(fsys'); resume(())
}
}
# sig closeFile : (File) ~> File
# fun closeFile((=front,=rear)) {
# (front=front ++ reverse(rear), rear=[])
# }
sig redirect : (Comp(a, {Puts:(FileDescr,String) -> () |e}), FileDescr) {Puts:(FileDescr,String) -> () |e}~> a
fun redirect(m, fd) {
handle(m()) {
case Puts(_,s,resume) -> resume(puts(fd, s))
}
}
# sig allowState : (() {Get-,Put- |e}~> a) -> () {Get:s,Put:(s) -> () |e}~> a
# fun allowState(f) { (f : (() {Get:s,Put:(s) -> () |e}~> a) <- (() {Get-,Put- |e}~> a)) }
# sig fileIO : (Comp(a, {Get-,Put-,Gets:(FileDescr) -> String,Puts:(FileDescr,String) -> (),Fclose:(FileDescr) -> (),Fopen:(Mode,String) -> FileDescr |e})) {Get:() {}-> FileSystem,Put:(FileSystem) -> (),Gets{_},Puts{_},Fclose{_},Fopen{_} |e}~> a
# fun fileIO(m) {
# handle(allowState(m)()) {
# case Gets(fd, resume) ->
# var fsys = get();
# var (ch, file) = readFile(lookupFile(fd, fsys));
# put(replaceFile(fd, file, fsys)); resume(ch)
# case Puts(fd, ch, resume) ->
# var fsys = get();
# var fsys' = replaceFile(fd, writeFile(ch, lookupFile(fd, fsys)), fsys);
# put(fsys'); resume(())
# case Fopen(mode, filename, resume) ->
# var fsys = get();
# var (fd, fsys') = openFile(mode, filename, fsys);
# put(fsys'); resume(fd)
# case Fclose(fd, resume) ->
# var fsys = get();
# var fsys' = replaceFile(fd, closeFile(lookupFile(fd, fsys)), fsys);
# put(fsys'); resume(())
# }
# }
# sig redirect : (Comp(a, {Puts:(FileDescr,String) -> () |e}), FileDescr) {Puts:(FileDescr,String) -> () |e}~> a
# fun redirect(m, fd) {
# handle(m()) {
# case Puts(_,s,resume) -> resume(puts(fd, s))
# }
# }
##
## Processes
@@ -331,70 +355,70 @@ fun whoami() { getenv("USER") }
##
# Tags puts with the name of the current user.
sig provenance : (Comp(a, {Getenv:(String) -> String,Puts:(FileDescr,String) -> () |e})) {Getenv:(String) -> String,Puts:(FileDescr,String) -> () |e}~> a
fun provenance(m) {
handle(m()) {
case Puts(fd, s, resume) ->
var user = whoami();
resume(do Puts(fd, user ^^ "> " ^^ s))
}
}
# sig provenance : (Comp(a, {Getenv:(String) -> String,Puts:(FileDescr,String) -> () |e})) {Getenv:(String) -> String,Puts:(FileDescr,String) -> () |e}~> a
# fun provenance(m) {
# handle(m()) {
# case Puts(fd, s, resume) ->
# var user = whoami();
# resume(do Puts(fd, user ^^ "> " ^^ s))
# }
# }
# An example of everything plugged together: a time-shared 'Hello World'.
sig example : () {Fork:Bool,Getenv:(String) -> String,Su:(User) -> (),Puts:(FileDescr,String) -> (),Yield:() |_}~> ()
fun example() {
var pid = fork();
var () = {
if (pid) redirect(fun(){puts(stdout, "dummy")}, stderr)
else if (fork()) su(Alice)
else su(Bob)
};
var user = whoami();
puts(stdout, "Hello World!");
var uid = getenv("UID");
echo("My UID is " ^^ uid);
(if (amiroot()) { yield(); echo(user ^^ " is running as root.") } else ());
echo("My home dir is /home/" ^^ user)
}
# # An example of everything plugged together: a time-shared 'Hello World'.
# sig example : () {Fork:Bool,Getenv:(String) -> String,Su:(User) -> (),Puts:(FileDescr,String) -> (),Yield:() |_}~> ()
# fun example() {
# var pid = fork();
# var () = {
# if (pid) redirect(fun(){puts(stdout, "dummy")}, stderr)
# else if (fork()) su(Alice)
# else su(Bob)
# };
# var user = whoami();
# puts(stdout, "Hello World!");
# var uid = getenv("UID");
# echo("My UID is " ^^ uid);
# (if (amiroot()) { yield(); echo(user ^^ " is running as root.") } else ());
# echo("My home dir is /home/" ^^ user)
# }
# Wiring of handlers.
sig init : () {Fork{_},Getenv{_},Su{_},Puts{_},Yield{_} |_}~> [String]
fun init() {
basicIO(fun() {
schedule(fun() {
usermgr(Root, envs, fun() {
provenance(example)
})
})
})
}
# # Wiring of handlers.
# sig init : () {Fork{_},Getenv{_},Su{_},Puts{_},Yield{_} |_}~> [String]
# fun init() {
# basicIO(fun() {
# schedule(fun() {
# usermgr(Root, envs, fun() {
# provenance(example)
# })
# })
# })
# }
sig example' : () {Fork:Bool,Fclose:(FileDescr) -> (),Fopen:(Mode,String) -> FileDescr,Getenv:(String) -> String,Su:(User) -> (),Puts:(FileDescr,String) -> (),Yield:() |_}~> ()
fun example'() {
var pid = fork();
var () = {
if (pid) redirect(fun(){puts(stdout, "dummy")}, stderr)
else if (fork()) su(Alice)
else su(Bob)
};
var user = whoami();
var fd = fopen(Append, user ^^ ".txt");
puts(fd, "Hello World!");
var uid = getenv("UID");
echo("My UID is " ^^ uid);
(if (amiroot()) { yield(); echo(user ^^ " is running as root.") } else ());
echo("My home dir is /home/" ^^ user);
fclose(fd)
}
# sig example' : () {Fork:Bool,Fclose:(FileDescr) -> (),Fopen:(Mode,String) -> FileDescr,Getenv:(String) -> String,Su:(User) -> (),Puts:(FileDescr,String) -> (),Yield:() |_}~> ()
# fun example'() {
# var pid = fork();
# var () = {
# if (pid) redirect(fun(){puts(stdout, "dummy")}, stderr)
# else if (fork()) su(Alice)
# else su(Bob)
# };
# var user = whoami();
# var fd = fopen(Append, user ^^ ".txt");
# puts(fd, "Hello World!");
# var uid = getenv("UID");
# echo("My UID is " ^^ uid);
# (if (amiroot()) { yield(); echo(user ^^ " is running as root.") } else ());
# echo("My home dir is /home/" ^^ user);
# fclose(fd)
# }
sig init' : (FileSystem) {Fclose{_},Fopen{_},Fork{_},Get{_},Getenv{_},Gets{_},Put{_},Puts{_},Su{_},Yield{_}|_}~> ((), FileSystem)
fun init'(fsys) {
runState(fsys, fun() {
fileIO(fun() {
schedule(fun() {
usermgr(Root, envs, example')
})
})
})
}
# sig init' : (FileSystem) {Fclose{_},Fopen{_},Fork{_},Get{_},Getenv{_},Gets{_},Put{_},Puts{_},Su{_},Yield{_}|_}~> ((), FileSystem)
# fun init'(fsys) {
# runState(fsys, fun() {
# fileIO(fun() {
# schedule(fun() {
# usermgr(Root, envs, example')
# })
# })
# })
# }

View File

@@ -680,3 +680,18 @@ fun tcphandshakeFail() {
performTCP(tcpserver, 84, sfd, cfd)
}
}
#
# Grep
#
#sig grep : (String) {Await:Char,Yield:(Char) -> () |_}~> ()
fun grep(str) {
var cs = explode(str);
fun match(c,cs) {
switch (cs) {
case c' :: cs' ->
if (c == '\n') fail()
if (c == c')
}
}
}

View File

@@ -4,12 +4,14 @@
\newcommand{\defas}[0]{\mathrel{\overset{\makebox[0pt]{\mbox{\normalfont\tiny\text{def}}}}{=}}}
\newcommand{\defnas}[0]{\mathrel{:=}}
\newcommand{\simdefas}[0]{\mathrel{\overset{\makebox[0pt]{\mbox{\normalfont\tiny\text{def}}}}{\simeq}}}
\newcommand{\adef}[0]{\mathrel{\overset{\makebox[0pt]{\mbox{\normalfont\tiny{\text{$\alpha$-def}}}}}{\simeq}}}
%%
%% Some useful maths abbreviations
%%
\newcommand{\C}{\ensuremath{\mathbb{C}}}
\newcommand{\N}{\ensuremath{\mathbb{N}}}
\newcommand{\R}{\ensuremath{\mathbb{R}}}
\newcommand{\Z}{\ensuremath{\mathbb{Z}}}
\newcommand{\B}{\ensuremath{\mathbb{B}}}
\newcommand{\BB}[1]{\ensuremath{\mathbf{#1}}}
@@ -17,6 +19,12 @@
% \newcommand{\Delim}[1]{\ensuremath{\langle\!\!\mkern-1.5mu\langle#1\rangle\!\!\mkern-1.5mu\rangle}}
\newcommand{\Delim}[1]{\ensuremath{\keyw{del}.#1}}
\newcommand{\sembr}[1]{\ensuremath{\llbracket #1 \rrbracket}}
\newcommand{\BigO}{\ensuremath{\mathcal{O}}}
\newcommand{\SC}{\ensuremath{\mathsf{S}}}
\newcommand{\ST}{\ensuremath{\mathsf{T}}}
\newcommand{\ar}{\ensuremath{\mathsf{ar}}}
\newcommand{\Tm}{\ensuremath{\mathsf{Tm}}}
\newcommand{\Ty}{\ensuremath{\mathsf{Ty}}}
%%
%% Partiality
@@ -41,6 +49,9 @@
\newcommand{\EffCalc}{\ensuremath{\lambda_{\mathsf{eff}}}\xspace}
\newcommand{\UCalc}{\ensuremath{\lambda_{\mathsf{u}}}\xspace}
\newcommand{\param}{\ensuremath{\ddagger}}
\newcommand{\HPCalc}{\ensuremath{\lambda_{\mathsf{h^\param}}}\xspace}
\newcommand{\HPCF}{\ensuremath{\lambda^\rightarrow_{\mathsf{h}}}\xspace}
\newcommand{\BPCF}{\ensuremath{\lambda^\rightarrow_{\mathsf{b}}}\xspace}
%%
%% Calculi terms and types type-setting.
@@ -73,6 +84,8 @@
\newcommand{\Inl}{\keyw{inl}}
\newcommand{\Inr}{\keyw{inr}}
\newcommand{\Thunk}{\lambda \Unit.}
\newcommand{\PCFRef}{\dec{Ref}}
\newcommand{\refv}{\keyw{ref}}
\newcommand{\Pre}[1]{\mathsf{Pre}(#1)}
\newcommand{\Abs}{\mathsf{Abs}}
@@ -132,6 +145,10 @@
\newcommand{\Res}{\keyw{res}}
\newcommand{\Cong}{\mathrm{cong}}
\newcommand{\AlgTheory}{\ensuremath{\mathcal{T}}}
%% Handler projections.
\newcommand{\mret}{\mathrm{ret}}
\newcommand{\mops}{\mathrm{ops}}
@@ -140,6 +157,7 @@
\newcommand{\hops}{H^{\mops}}
%\newcommand{\hex}{H^{\mathrm{ex}}}
\newcommand{\hell}{H^{\ell}}
\newcommand{\gell}{\theta^{\ell}}
\newcommand{\depth}{\delta}
@@ -188,6 +206,14 @@
\newcommand{\EvalCat}{\CatName{Cont}}
\newcommand{\UEvalCat}{\CatName{UCont}}
\newcommand{\HandlerCat}{\CatName{HDef}}
\newcommand{\MConfCat}{\CatName{Conf}}
\newcommand{\MEnvCat}{\CatName{Env}}
\newcommand{\MValCat}{\CatName{Mval}}
\newcommand{\MGContCat}{\CatName{GenCont}}
\newcommand{\MGFrameCat}{\CatName{GenFrame}}
\newcommand{\MPContCat}{\CatName{PureCont}}
\newcommand{\MPFrameCat}{\CatName{PureFrame}}
\newcommand{\MHCloCat}{\CatName{HClo}}
%%
%% Lindley's array stuff.
@@ -222,6 +248,7 @@
\newcommand{\concat}{\mathbin{+\!\!+}}
\newcommand{\revconcat}{\mathbin{\widehat{\concat}}}
\newcommand{\snoc}[2]{\ensuremath{#1 \concat [#2]}}
%%
%% CPS notation
@@ -305,8 +332,9 @@
% Canonical variables for handler components
\newcommand{\vhret}{h^{\mret}}
\newcommand{\vhops}{h^{\mops}}
\newcommand{\svhret}{\chi^{\mret}}
\newcommand{\svhops}{\chi^{\mops}}
\newcommand{\sv}{\chi}
\newcommand{\svhret}{\sv^{\mret}}
\newcommand{\svhops}{\sv^{\mops}}
% \newcommand{\dk}{\dRecord{fs,\dRecord{\vhret,\vhops}}}
\newcommand{\dk}{k}
@@ -334,8 +362,18 @@
\newcommand{\fail}{\dec{fail}}
\newcommand{\optionalise}{\dec{optionalise}}
\newcommand{\bind}{\ensuremath{\gg\!=}}
\newcommand{\return}{\dec{return}}
\newcommand{\return}{\dec{Return}}
\newcommand{\faild}{\dec{withDefault}}
\newcommand{\Free}{\dec{Free}}
\newcommand{\FreeState}{\dec{FreeState}}
\newcommand{\OpF}{\dec{Op}}
\newcommand{\DoF}{\dec{do}}
\newcommand{\getF}{\dec{get}}
\newcommand{\putF}{\dec{put}}
\newcommand{\fmap}{\dec{fmap}}
\newcommand{\toggle}{\dec{toggle}}
\newcommand{\incrEven}{\dec{incrEven}}
\newcommand{\even}{\dec{even}}
% Abstract machine
\newcommand{\cek}[1]{\ensuremath{\langle #1 \rangle}}
@@ -351,6 +389,22 @@
% configurations
\newcommand{\conf}{\mathcal{C}}
% effect sugar
\newcommand{\inward}[1]{\mathcal{I}\sembr{#1}}
\newcommand{\outward}[1]{\mathcal{O}\sembr{#1}}
\newcommand{\xcomp}[1]{\outward{#1}}
\newcommand{\xval}[1]{\outward{#1}}
\newcommand{\xpre}[1]{\outward{#1}}
\newcommand{\xrow}[1]{\outward{#1}}
\newcommand{\xeff}[1]{\outward{#1}}
\newcommand{\pcomp}[1]{\inward{#1}}
\newcommand{\pval}[1]{\inward{#1}}
\newcommand{\ppre}[1]{\inward{#1}}
\newcommand{\prow}[1]{\inward{#1}}
\newcommand{\peff}[1]{\inward{#1}}
\newcommand{\eamb}{\ensuremath{E_{\mathsf{amb}}}}
\newcommand{\trval}[1]{\mathcal{T}\sembr{#1}}
% UNIX example
\newcommand{\UNIX}{UNIX}
\newcommand{\OSname}[0]{Tiny UNIX}
@@ -362,9 +416,10 @@
\newcommand{\Putc}{\dec{Putc}}
\newcommand{\putc}{\dec{putc}}
\newcommand{\UFile}{\dec{File}}
\newcommand{\UFD}{\dec{INumber}}
\newcommand{\UFD}{\dec{FileDescr}}
\newcommand{\fwrite}{\dec{fwrite}}
\newcommand{\iter}{\dec{iter}}
\newcommand{\map}{\dec{map}}
\newcommand{\stdout}{\dec{stdout}}
\newcommand{\IO}{\dec{IO}}
\newcommand{\BIO}{\dec{BIO}}
@@ -423,6 +478,42 @@
\newcommand{\lookup}{\dec{lookup}}
\newcommand{\modify}{\dec{modify}}
\newcommand{\fileIO}{\dec{fileIO}}
\newcommand{\ULink}{\dec{Link}}
\newcommand{\UUnlink}{\dec{Unlink}}
\newcommand{\flink}{\dec{flink}}
\newcommand{\funlink}{\dec{funlink}}
\newcommand{\remove}{\dec{remove}}
\newcommand{\FileLU}{\dec{FileLU}}
\newcommand{\fileLU}{\dec{fileLU}}
\newcommand{\FileIO}{\dec{FileIO}}
\newcommand{\FileRW}{\dec{FileRW}}
\newcommand{\FileCO}{\dec{FileCO}}
\newcommand{\cat}{\dec{cat}}
\newcommand{\head}{\dec{head}}
\newcommand{\grep}{\dec{grep}}
\newcommand{\match}{\dec{match}}
\newcommand{\wc}{\dec{wc}}
\newcommand{\forever}{\dec{forever}}
\newcommand{\textnil}{\textbackslash{}0}
\newcommand{\charlit}[1]{\texttt{'#1'}}
\newcommand{\where}{\keyw{where}}
\newcommand{\intToString}{\dec{intToString}}
\newcommand{\freq}{\dec{freq}}
\newcommand{\paste}{\dec{paste}}
\newcommand{\sed}{\dec{sed}}
\newcommand{\printTable}{\dec{renderTable}}
\newcommand{\timesharee}{\dec{timeshare2}}
\newcommand{\Co}{\dec{Co}}
\newcommand{\UFork}{\dec{UFork}}
\newcommand{\ufork}{\dec{ufork}}
\newcommand{\Wait}{\dec{Wait}}
\newcommand{\scheduler}{\dec{scheduler}}
\newcommand{\Sstate}{\dec{Sstate}}
\newcommand{\Ready}{\dec{Ready}}
\newcommand{\Blocked}{\dec{Blocked}}
\newcommand{\init}{\dec{init}}
\newcommand{\Reader}{\dec{Reader}}
\newcommand{\Other}{\dec{Other}}
%%
%% Some control operators
@@ -439,11 +530,16 @@
\newcommand{\Catchcont}{\keyw{catchcont}}
\newcommand{\Control}{\keyw{control}}
\newcommand{\Prompt}{\#}
\newcommand{\Controlz}{\keyw{control0}}
\newcommand{\Promptz}{\#_0}
\newcommand{\Controlz}{\ensuremath{\keyw{control_0}}}
\newcommand{\Spawn}{\keyw{spawn}}
\newcommand{\Promptz}{\ensuremath{\#_0}}
\newcommand{\Escape}{\keyw{escape}}
\newcommand{\shift}{\keyw{shift}}
\newcommand{\shiftz}{\keyw{shift0}}
\newcommand{\shiftz}{\ensuremath{\keyw{shift_0}}}
\newcommand{\CCpp}{\ensuremath{+\CC+}}
\newcommand{\CCpm}{\ensuremath{+\CC-}}
\newcommand{\CCmp}{\ensuremath{-\CC+}}
\newcommand{\CCmm}{\ensuremath{-\CC-}}
\def\sigh#1{%
\pmb{\left\langle\vphantom{#1}\right.}%
#1%
@@ -451,6 +547,8 @@
\newcommand{\llambda}{\ensuremath{\pmb{\lambda}}}
\newcommand{\reset}[1]{\pmb{\langle} #1 \pmb{\rangle}}
\newcommand{\resetz}[1]{\pmb{\langle} #1 \pmb{\rangle}_0}
\newcommand{\dollarz}[2]{\ensuremath{\reset{#2 \mid #1}}}
\newcommand{\dollarzh}[2]{\ensuremath{#1\,\$_0#2}}
\newcommand{\fcontrol}{\keyw{fcontrol}}
\newcommand{\fprompt}{\%}
\newcommand{\splitter}{\keyw{splitter}}
@@ -465,3 +563,289 @@
\newcommand{\Algol}{Algol~60}
\newcommand{\qq}[1]{\ensuremath{\ulcorner #1 \urcorner}}
\newcommand{\prompttype}{\dec{Prompt}}
\newcommand{\async}{\keyw{async}}
\newcommand{\await}{\keyw{await}}
% Language macros
\newcommand{\Frank}{Frank}
\newcommand{\SML}{SML}
\newcommand{\SMLNJ}{\SML{}/NJ}
\newcommand{\OCaml}{OCaml}
%%
%% Asymptotic improvement macros
%%
\newcommand{\LLL}{\ensuremath{\mathcal L}}
\newcommand{\naive}{naïve\xspace}
\newcommand{\naively}{naïvely\xspace}
\newcommand{\Naive}{Naïve\xspace}
\newcommand{\sem}[1]{\ensuremath{\pi_{#1}}}
\newcommand{\Iff}{\Leftrightarrow}
\newcommand{\Implies}{\Rightarrow}
\newcommand{\BCalcS}{\ensuremath{\lambda_{\textrm{\normalfont s}}\xspace}}
\newcommand{\BCalcE}{\ensuremath{\lambda_{\textrm{\normalfont e}}\xspace}}
\newcommand{\BCalcSE}{\ensuremath{\lambda_{\textrm{\normalfont se}}\xspace}}
\newcommand{\BSPCF}{\ensuremath{\lambda^\rightarrow_{\textrm{\normalfont s}}\xspace}}
\newcommand{\BEPCF}{\ensuremath{\lambda^\rightarrow_{\textrm{\normalfont e}}\xspace}}
\newcommand{\BSEPCF}{\ensuremath{\lambda^\rightarrow_{\textrm{\normalfont se}}\xspace}}
\newcommand{\IfZero}{\keyw{ifzero}}
\newcommand{\Superpoint}{\lambda\_.\Do\;\Branch~\Unit}
\newcommand{\ECount}{\dec{effcount}}
\newcommand{\Countprog}{K}
\newcommand{\Plus}{\mathsf{Plus}}
\newcommand{\Minus}{\mathsf{Minus}}
\newcommand{\Eq}{\mathsf{Eq}}
\newcommand{\BList}{\mathbb{B}^\ast}
\newcommand{\CtxCat}{\CatName{Ctx}}
\newcommand{\PureCont}{\mathsf{PureCont}}
\newcommand{\Addr}{\mathsf{Addr}}
\newcommand{\Lab}{\mathsf{Lab}}
\newcommand{\Env}{\mathsf{Env}}
\newcommand{\Time}{\dec{DTIME}}
\newcommand{\query}{\mathord{?}}
\newcommand{\ans}{\mathord{!}}
\newcommand{\labs}{\mathsf{labs}}
\newcommand{\steps}{\mathsf{steps}}
\newcommand{\tree}{\tau}
\newcommand{\tl}{\labs(\tree)}
\newcommand{\ts}{\steps(\tree)}
\newcommand{\T}[1]{\ensuremath{\mathcal{T}_{#1}}}
\newcommand{\Config}{\dec{Config}}
\newcommand{\cekl}{\langle}
\newcommand{\cekr}{\rangle}
\newcommand{\const}[1]{\ulcorner #1 \urcorner}
\newcommand{\HC}{\ensuremath{\mathcal{H}}}
\newcommand{\tr}{\mathcal{T}}
\newcommand{\tru}{\mathcal{U}}
\newcommand{\Tree}{\dec{Tree}}
\newcommand{\TimedTree}{\dec{TimedTree}}
\newcommand{\denotep}[1]{\ensuremath{\mathbb{P}\llbracket #1 \rrbracket}}
\newcommand\ttTwoTree{
\begin{tikzpicture}[->,>=stealth',level/.style={sibling distance = 4cm/##1,
level distance = 2.0cm}]
\node (root) [opnode] {Branch}
child { node [opnode] {Branch}
child { node [leaf] {$\True$}
edge from parent node[above left] {$\True$}
}
child { node [leaf] {$\True$}
edge from parent node[above right] {$\False$}
}
edge from parent node[above left] {$\True$}
}
child { node [opnode] {Branch}
child { node [leaf] {$\True$}
edge from parent node[above left] {$\True$}
}
child { node [leaf] {$\True$}
edge from parent node[above right] {$\False$}
}
edge from parent node[above right] {$\False$}
}
;
\end{tikzpicture}}
\newcommand{\tossTree}{
\begin{tikzpicture}[->,>=stealth',level/.style={sibling distance = 2.5cm/##1,
level distance = 1.0cm}]
\node (root) [opnode] {$\dec{Branch}$}
child { node [leaf] {$\dec{Heads}$}
edge from parent node[above left] {$\True$}
}
child { node [leaf] {$\dec{Tails}$}
edge from parent node[above right] {$\False$}
}
;
\end{tikzpicture}}
\newenvironment{twoeqs}{\ba[t]{@{}r@{~}c@{~}l@{~}c@{~}r@{~}c@{~}l@{}}}{\ea}
\newcommand{\compTreeEx}{
\begin{tikzpicture}[->,>=stealth',level/.style={sibling distance = 2.0cm/##1,
level distance = 2.0cm}]
\node (root) [opnode] {$\getF$}
child { node [yshift=15] {$\dots$}
edge from parent {}
}
child { node [opnode] {$\putF$}
child { node {$\True$}
edge from parent node[left] {$\Unit$}
}
edge from parent node[yshift=5,left] {$-2$}
}
child { node [opnode] {$\putF$}
child { node {$\False$}
edge from parent node[left] {$\Unit$}
}
edge from parent node[yshift=2,left] {$-1$}
}
child { node [opnode] {$\putF$}
child { node {$\True$}
edge from parent node[left] {$\Unit$}
}
edge from parent node[left] {$0$}
}
child { node [opnode] {$\putF$}
child { node {$\False$}
edge from parent node[right] {$\Unit$}
}
edge from parent node[yshift=2,right] {$1$}
}
child { node [opnode] {$\putF$}
child { node {$\True$}
edge from parent node[right] {$\Unit$}
}
edge from parent node[yshift=5,right] {$2$}
}
child { node [yshift=15] {$\dots$}
edge from parent {}
}
;
\end{tikzpicture}}
\newcommand{\smath}[1]{\ensuremath{{\scriptstyle #1}}}
\newcommand{\InfiniteModel}{%
\begin{tikzpicture}[->,>=stealth',level/.style={sibling distance = 3.0cm/##1,
level distance = 1.0cm}]
\node (root) [draw=none] { }
child { node [opnode] {$\smath{\query 0}$}
child { node [opnode] {$\smath{\query 0}$}
child { node [draw=none,rotate=165] {$\vdots$}
edge from parent node { }
}
child { node[leaf] {$\smath{\ans\False}$}
edge from parent node { }
}
edge from parent node { }
}
child { node [leaf] {$\smath{\ans\False}$}
edge from parent node { }
}
edge from parent node { }
}
;
\end{tikzpicture}}
%
\newcommand{\ShortConjModel}{%
\begin{tikzpicture}[->,>=stealth',level/.style={sibling distance = 3.5cm/##1,
level distance = 1.0cm}]
\node (root) [draw=none] { }
child { node [opnode] {$\smath{\query 0}$}
child { node [opnode] {$\smath{\query 0}$}
child { node [treenode] {$\smath{\ans\True}$}
edge from parent node { }
}
child { node[treenode] {$\smath{\ans\False}$}
edge from parent node { }
}
edge from parent node { }
}
child { node [treenode] {$\smath{\ans\False}$}
edge from parent node { }
}
edge from parent node { }
}
;
\end{tikzpicture}}
%
\newcommand{\TTTwoModel}{%
\begin{tikzpicture}[->,>=stealth',level/.style={sibling distance = 8cm/##1,
level distance = 1.5cm}]
\node (root) [draw=none] { }
child { node [opnode] {$\smath{\query 0}$}
child { node [opnode] {$\smath{\query 1}$}
child { node [leaf] {$\smath{\ans\True}$}
edge from parent node { }
}
child { node[leaf] {$\smath{\ans\True}$}
edge from parent node { }
}
edge from parent node { }
}
child { node [opnode] {$\smath{\query 1}$}
child { node [leaf] {$\smath{\ans\True}$}
edge from parent node { }
}
child { node[leaf] {$\smath{\ans\True}$}
edge from parent node { }
}
edge from parent node { }
}
edge from parent node { }
}
;
\end{tikzpicture}}
%
\newcommand{\XORTwoModel}{%
\begin{tikzpicture}[->,>=stealth',level/.style={sibling distance = 5.5cm/##1,
level distance = 1cm}]
\node (root) [draw=none] { }
child { node [opnode] {$\smath{\query 0}$}
child { node [opnode] {$\smath{\query 1}$}
child { node [treenode] {$\smath{\ans\False}$}
edge from parent node { }
}
child { node[treenode] {$\smath{\ans\True}$}
edge from parent node { }
}
edge from parent node { }
}
child { node [opnode] {$\smath{\query 1}$}
child { node [treenode] {$\smath{\ans\True}$}
edge from parent node { }
}
child { node[treenode] {$\smath{\ans\False}$}
edge from parent node { }
}
edge from parent node { }
}
edge from parent node { }
}
;
\end{tikzpicture}}
%
\newcommand{\SXORTwoModel}{%
\begin{tikzpicture}[->,>=stealth',level/.style={sibling distance = 2.5cm/##1,
level distance = 1cm}]
\node (root) [opnode] {$\smath{\query 0}$}
child { node [opnode] {$\smath{\query 1}$}
child { node [treenode] {$\smath{\ans\False}$}
edge from parent node { }
}
child { node[treenode] {$\smath{\ans\True}$}
edge from parent node { }
}
edge from parent node { }
}
child { node [opnode] {$\smath{\query 1}$}
child { node [treenode] {$\smath{\ans\True}$}
edge from parent node { }
}
child { node[treenode] {$\smath{\ans\False}$}
edge from parent node { }
}
edge from parent node { }
}
;
\end{tikzpicture}}
%
\newcommand{\TTZeroModel}{%
\begin{tikzpicture}[->,>=stealth',level/.style={sibling distance = 1cm/##1,
level distance = 1cm}]
\node (root) [draw=none] { }
child { node [treenode] {$\smath{\ans\True}$}
edge from parent node { }
}
;
\end{tikzpicture}}%

32
slides/Makefile Normal file
View File

@@ -0,0 +1,32 @@
TEXC=pdflatex
CFLAGS=-interaction=nonstopmode -halt-on-error -file-line-error
BIBC=bibtex
PAPER=viva
BIBLIO=$(PAPER)
LATEST_COMMIT=$(shell git log --format="%h" -n 1)
all: $(PAPER).pdf
draft: $(PAPER).pdf-draft
$(PAPER).aux: $(PAPER).tex
$(TEXC) $(CFLAGS) $(PAPER)
$(BIBLIO).bbl: $(PAPER).aux $(BIBLIO).bib
$(BIBC) $(PAPER)
$(PAPER).pdf: $(PAPER).aux $(BIBLIO).bbl
$(TEXC) $(CFLAGS) $(PAPER)
$(TEXC) $(CFLAGS) $(PAPER)
$(PAPER).pdf-draft: CFLAGS:=$(CFLAGS) "\def\DRAFT{$(LATEST_COMMIT)}\input{$(PAPER)}"
$(PAPER).pdf-draft: all
mv $(PAPER).pdf $(PAPER)-draft.pdf
tar cf thesis-draft.tar.gz $(PAPER)-draft.pdf
clean:
rm -f *.log *.aux *.toc *.out
rm -f *.bbl *.blg *.fls *.xml
rm -f *.nav *.snm
rm -f *.fdb_latexmk *.vtc *.cut
rm -f $(PAPER).pdf camera-ready.pdf submission.pdf
rm -f *.o *.cmx *.cmo

82
slides/viva.bib Normal file
View File

@@ -0,0 +1,82 @@
@inproceedings{HillerstromL16,
author = {Daniel Hillerstr{\"{o}}m and
Sam Lindley},
title = {Liberating effects with rows and handlers},
booktitle = {TyDe@ICFP},
pages = {15--27},
publisher = {{ACM}},
year = {2016}
}
@inproceedings{HillerstromLAS17,
author = {Daniel Hillerstr{\"{o}}m and
Sam Lindley and
Robert Atkey and
{KC} Sivaramakrishnan},
title = {Continuation Passing Style for Effect Handlers},
booktitle = {{FSCD}},
series = {LIPIcs},
volume = {84},
pages = {18:1--18:19},
OPTpublisher = {Schloss Dagstuhl - Leibniz-Zentrum fuer Informatik},
year = {2017}
}
@inproceedings{HillerstromL18,
author = {Daniel Hillerstr{\"{o}}m and
Sam Lindley},
title = {Shallow Effect Handlers},
booktitle = {{APLAS}},
OPTseries = {Lecture Notes in Computer Science},
series = {{LNCS}},
volume = {11275},
pages = {415--435},
publisher = {Springer},
year = {2018}
}
@article{HillerstromLA20,
author = {Daniel Hillerstr{\"{o}}m and
Sam Lindley and
Robert Atkey},
title = {Effect handlers via generalised continuations},
journal = {J. Funct. Program.},
volume = {30},
pages = {e5},
year = {2020}
}
@article{HillerstromLL20,
author = {Daniel Hillerstr{\"{o}}m and
Sam Lindley and
John Longley},
title = {Effects for Efficiency: Asymptotic Speedup with First-Class Control},
journal = {Proc. {ACM} Program. Lang.},
volume = {4},
number = {{ICFP}},
pages = {100:1--100:29},
year = {2020}
}
# Unix
@article{RitchieT74,
author = {Dennis Ritchie and
Ken Thompson},
title = {The {UNIX} Time-Sharing System},
journal = {Commun. {ACM}},
volume = {17},
number = {7},
pages = {365--375},
year = {1974}
}
# CEK & C
@InProceedings{FelleisenF86,
title={Control Operators, the {SECD}-machine, and the $\lambda$-Calculus},
author={Felleisen, Matthias and Friedman, Daniel P.},
year=1987,
booktitle = {Formal Description of Programming Concepts III},
OPTbooktitle = {The Proceedings of the Conference on Formal Description of Programming Concepts III, Ebberup, Denmark},
pages = {193--217},
OPTpublisher={North Holland}
}

201
slides/viva.tex Normal file
View File

@@ -0,0 +1,201 @@
\documentclass[169,10pt,compress,dvipsnames]{beamer}
%%
%% Slides layout
%%
\beamertemplatenavigationsymbolsempty % hides navigation buttons
\usetheme{Madrid} % standard Madrid theme
\setbeamertemplate{footline}{} % renders the footer empty
%
\setbeamertemplate{bibliography item}{ % this is a hack to prevent Madrid theme + biblatex
\hspace{-0.4cm}\lower3pt\hbox{ % from causing bibliography entries to run over
\pgfuseimage{beamericonarticle} % the slide margins
}}
%%
%% Packages
%%
\usepackage[utf8]{inputenc} % enable UTF-8 compatible typing
\usepackage{hyperref} % interactive PDF
\usepackage[sort&compress,square,numbers]{natbib} % Bibliography
\usepackage{bibentry} % Print bibliography entries inline.
\makeatletter % Redefine bibentry to omit hyperrefs
\renewcommand\bibentry[1]{\nocite{#1}{\frenchspacing
\@nameuse{BR@r@#1\@extra@b@citeb}}}
\makeatother
\nobibliography* % use the bibliographic data from the standard BibTeX setup.
\usepackage{amsmath,amssymb,mathtools} % maths typesetting
\usepackage{../pkgs/mathpartir} % Inference rules
\usepackage{../pkgs/mathwidth} % renders character sequences nicely in math mode
\usepackage{stmaryrd} % semantic brackets
\usepackage{xspace} % proper spacing for macros in text
\usepackage[T1]{fontenc} % 8-bit font encoding
% native support for accented characters.
\usepackage[scaled=0.85]{beramono} % smoother typewriter font
\newcommand*{\Scale}[2][4]{\scalebox{#1}{\ensuremath{#2}}}%
\input{../macros.tex}
%%
%% Meta information
%%
\author{Daniel Hillerström}
\title{Foundations for Programming and Implementing Effect Handlers}
\institute{The University of Edinburgh, Scotland UK}
\subtitle{PhD viva}
\date{August 13, 2021}
%%
%% Slides
%%
\begin{document}
%
% Title slide
%
\begin{frame}
\maketitle
\end{frame}
% Dissertation overview
\begin{frame}
\frametitle{My dissertation at glance}
Three main strands of work
\begin{description}
\item[Programming] Language design and applications of effect handlers.
\item[Implementation] Canonical implementation strategies for effect handlers.
\item[Expressiveness] Exploration of the computational expressiveness of effect handlers.
\end{description}
\end{frame}
\begin{frame}
\frametitle{Calculi for deep, shallow, and parameterised handlers}
The calculi capture key aspects of the implementation of effect
handlers in Links.
\begin{itemize}
\item $\HCalc$ ordinary deep handlers (fold).
\item $\SCalc$ shallow handlers (case-split).
\item $\HPCalc$ parameterised deep handlers (fold+state).
\end{itemize}
The actual implementation is the union of the three calculi.\\[2em]
\textbf{Relevant papers} TyDe'16~\cite{HillerstromL16},
APLAS'18~\cite{HillerstromL18}, JFP'20~\cite{HillerstromLA20}.
\end{frame}
% UNIX
\begin{frame}
\frametitle{Effect handlers as composable operating systems}
An interpretation of \citeauthor{RitchieT74}'s
UNIX~\cite{RitchieT74} in terms of effect handlers.\\[2em]
\[
\bl
\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\!\textbf{Basic idea}
\ba[m]{@{\qquad}r@{~}c@{~}l}
\text{\emph{system call}} &\approx& \text{\emph{operation invocation}}\\
\text{\emph{system call implementation}} &\approx& \text{\emph{operation interpretation}}
\ea
\el
\]\hfill\\[2em]
\textbf{Key point} Legacy code is modularly retrofitted with functionality.
\end{frame}
% CPS translation
\begin{frame}
\frametitle{CPS transforms for effect handlers}
A higher-order CPS transform for effect handlers with generalised
continuations.\\[1em]
\textbf{Generalised continuation} Structured representation of
delimited continuations.\\[0.5em]
\[
\Scale[1.8]{\kappa = \overline{(\sigma, (\hret,\hops))}}
\]\\[1em]
\textbf{Key point} Separate the \emph{doing} layer ($\sigma$) from the \emph{being} layer ($H$).\\[2em]
\textbf{Relevant papers} FSCD'17~\cite{HillerstromLAS17},
APLAS'18~\cite{HillerstromL18}, JFP'20~\cite{HillerstromLA20}.
\end{frame}
% Abstract machine
\begin{frame}
\frametitle{Abstract machine semantics for effect handlers}
Plugging generalised continuations into \citeauthor{FelleisenF86}'s
CEK machine~\cite{FelleisenF86} yields a runtime for effect
handlers.\\[2em]
\[
\Scale[2]{\cek{C \mid E \mid K = \overline{(\sigma, (H,E))}}}
\]\\[2em]
\textbf{Relevant papers} TyDe'16~\cite{HillerstromL16},
JFP'20~\cite{HillerstromLA20}.
\end{frame}
% Interdefinability of handlers
\begin{frame}
\frametitle{Interdefinability of effect handlers}
Deep, shallow, and parameterised handlers are interdefinable
w.r.t. to typability-preserving macro-expressiveness.
\begin{itemize}
\item Deep as shallow, $\mathcal{D}\llbracket - \rrbracket$, image is computationally lightweight.
\item Shallow as deep, $\mathcal{S}\llbracket - \rrbracket$, image is computationally expensive.
\item Parameterised as deep, $\mathcal{P}\llbracket - \rrbracket$,
image uses explicit state-passing.
\end{itemize}
~\\[1em]
\textbf{Relevant papers} APLAS'18~\cite{HillerstromL18},
JFP'20~\cite{HillerstromLA20}.
\end{frame}
% Asymptotic speed up with first-class control
\begin{frame}
\frametitle{Asymptotic speed up with effect handlers}
Effect handlers can make some programs faster!
\[
\Count_n : ((\Nat_n \to \Bool) \to \Bool) \to \Nat
\]\\[1em]
%
Using type-respecting expressiveness
\begin{itemize}
\item There \textbf{exists} an implementation of $\Count_n \in \HPCF$ with
effect handlers such that the runtime for every $n$-standard predicate $P$ is
$\Count_n~P = \BigO(2^n)$.
\item \textbf{Forall} implementations of $\Count_n \in \BPCF$ the runtime for every $n$-standard predicate $P$ is $\Count_n~P = \Omega(n2^n)$
\end{itemize}
~\\[1em]
\textbf{Relevant paper} ICFP'20~\cite{HillerstromLL20}.
\end{frame}
% Background
% \begin{frame}
% \frametitle{Continuations literature review}
% \end{frame}
%
% References
%
\begin{frame}%[allowframebreaks]
\frametitle{References}
\bibliographystyle{plainnat}
\bibliography{\jobname}
\end{frame}
\end{document}

1552
thesis.bib

File diff suppressed because it is too large Load Diff

26429
thesis.tex

File diff suppressed because it is too large Load Diff