-
Notifications
You must be signed in to change notification settings - Fork 11
/
protocol.clj
85 lines (78 loc) · 3.18 KB
/
protocol.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
;;----------------------------------------------------------------------
;; File protocol.clj
;; Written by Chris Frisz
;;
;; Created 26 Apr 2012
;; Last modified 26 Aug 2012
;;
;; Includes the protocols used in the CTCO compiler. These include the
;; following:
;;
;; PAbstractK:
;; Implemented by expressions for abstracting over the
;; representation of continuations.
;;
;; PCpsSrs:
;; Implemented by expressions which can undergo a CPS
;; transformation and are considered "serious." As a rule of
;; thumb, "serious" expressions are either function application
;; or expressions that include a function application as a
;; subexpression.
;;
;; PCpsTriv:
;; Implemented by expressions which can undergo a CPS
;; transformation and are considered "trivial." As a rule of
;; thumb, this includes simple expressions (numbers, booleans,
;; etc.) and non-function application expressions that contain
;; no serious subexpressions.
;;
;; PEmit:
;; Implemented by expressions that need to be emitted as code
;; from the intermediate representation used in CTCO.
;;
;; PThunkify:
;; Implemented by expressions for "thunkification," or the
;; process of ensuring a recursive function periodically returns
;; a function of no arguments, the basis for trampolining.
;;
;; PWalkable:
;; Implemented by expressions for which a new expression needs to
;; be created by applying a function to each of its
;; subexpressions. This can be thought of as "map" for
;; heterogeneously-shaped expressions. It's also generally only
;; used internally for limiting code reuse for expression
;; traversals in CTCO passes.
;;----------------------------------------------------------------------
(ns ctco.protocol)
(defprotocol PAbstractK
"Defines the 'abstract-k' function which abstracts over continutation
application using the given symbol to represent the function that implements
continutation appliction."
(abstract-k [this app-k]
"Abstracts over continutation application in an expression by converting
continuation applications to calls to app-k."))
(defprotocol PCpsSrs
"Protocol for applying the CPS transformation to serious expressions (a la
Olivier)."
(cps-srs [this k]
"Applies the CPS transformation for serious expressions with respect to the
Danvy-style CPS algorithm."))
(defprotocol PCpsTriv
"Protocol for applying the CPS transformations to trivial expressions (a la
Danvy)."
(cps-triv [this]
"Applies the CPS transformation for serious expressions with respect to the
Olivier-style CPS algorithm."))
(defprotocol PEmit
"Protocol for TCO expressions that can be represented as a sequence."
(emit [this]
"Emits a sequence representing the Clojure syntax for the TCO expression."))
(defprotocol PThunkify
"Protocol for expressions that can be thunkified in the TCO compiler."
(thunkify [this]
"Transform all functions to return thunks."))
(defprotocol PWalkable
"Protocol for TCO expressions that can be walked."
(walk-expr [this f ctor]
"Applies the function f to the subforms of the argument expression,
returning an expression created with the constructor."))