1
|
1
|
#+title: Universal Language |
0
|
2
|
#+author: Richard Westhaver |
|
3
|
#+email: ellis@rwest.io |
1
|
4
|
#+setupfile: ../clean.theme |
|
5
|
* Introduction |
|
6
|
:PROPERTIES: |
|
7
|
:ID: e63d129f-9024-4cd8-9e2c-77f4bc614663 |
|
8
|
:END: |
0
|
9
|
This document describes a *U-Language* as described by the late great |
|
10
|
[[https://iep.utm.edu/haskell-brooks-curry/][Haskell Curry]]: |
|
11
|
#+begin_quote |
|
12
|
Every investigation, including the present one, has to be communicated |
|
13
|
from one person to another by means of language. It is expedient to |
|
14
|
begin our study by calling attention to this obvious fact, by giving a |
|
15
|
name to the language being used, and by being explicit about a few of |
|
16
|
its features. We shall call the language being used the |
|
17
|
U-Language. [...] There would be no point in calling attention to it, |
|
18
|
if it were not for the fact that language is more intimately related |
|
19
|
to our job than of most others. |
|
20
|
#+end_quote |
|
21
|
|
|
22
|
In this document, we will be calling attention to our own language - |
|
23
|
examining it, and describing how it works. |
|
24
|
|
|
25
|
Our job is to solve problems. Hard problems preferred. So we ought to |
|
26
|
pay close attention to the language we use because it brings the |
|
27
|
reader and writer /closer/ to the problem at hand. |
|
28
|
|
|
29
|
For starters, we are primarily concerned with /written languages/ like |
|
30
|
the one you're reading now. We will skip past the obvious details - |
|
31
|
English is our primary form of communication for example. The line you |
|
32
|
are reading currently is a sentence which is part of a paragraph. |
|
33
|
|
1
|
34
|
- This document is for authors and curious readers. It is a loose |
0
|
35
|
specification, but also serves as introductory material into our |
6
|
36
|
communication style and design philosophy. |
1
|
37
|
- All sources we write attempt to comply to this standard but it is |
0
|
38
|
not strictly enforced. If there is a reason to not comply with a |
|
39
|
rule, it is already broken. |
|
40
|
|
1
|
41
|
** Org Mode |
0
|
42
|
:PROPERTIES: |
|
43
|
:ID: 98a02bb2-3f39-49c6-898a-68ccd8f3cbe1 |
|
44
|
:END: |
|
45
|
[[https://www.gnu.org/software/emacs/][GNU Emacs]] is our text editor, so naturally [[https://orgmode.org/][Org Mode]] is our word |
|
46
|
processor. |
|
47
|
|
|
48
|
If you are already familiar with Emacs and Org-Mode, I recommend |
|
49
|
opening the source of this document in Emacs and following along. |
|
50
|
|
|
51
|
If not, I recommend browsing through the [[https://orgmode.org/worg/][Worg resources]], but we won't |
|
52
|
be getting too deep into tribal hacker knowledge of Emacs. |
|
53
|
|
|
54
|
* ulang |
|
55
|
:PROPERTIES: |
1
|
56
|
:CUSTOM_ID: ulang |
|
57
|
:ID: 236227a5-b30c-4548-8cad-360428d74d67 |
|
58
|
:END: |
|
59
|
Our *U-Language* is colloquially termed *ulang*. Each section of this |
6
|
60
|
document describes a feature of our ulang. |
1
|
61
|
** Emphasis |
|
62
|
:PROPERTIES: |
|
63
|
:ID: 88bf1177-b5b7-4945-8bdc-5229803e617e |
0
|
64
|
:END: |
1
|
65
|
We derive all text emphasis syntax for rich contents from [[https://orgmode.org/manual/Emphasis-and-Monospace.html][Org Mode]]. |
|
66
|
#+name: org-emphasis |
|
67
|
#+begin_src org |
|
68
|
- *bold* |
|
69
|
- /italic/ |
|
70
|
- _underlined_ |
|
71
|
- =verbatim= |
|
72
|
- ~code~ |
|
73
|
- +strike-through+ |
|
74
|
#+end_src |
|
75
|
- *bold* |
|
76
|
- /italic/ |
|
77
|
- _underlined_ |
|
78
|
- =verbatim= |
|
79
|
- ~code~ |
|
80
|
- +strike-through+ |
|
81
|
|
|
82
|
Text emphasis markers may be embedded in any syntax as long as it does |
|
83
|
not cause any conflicts with the host language. |
6
|
84
|
** Links |
|
85
|
:PROPERTIES: |
|
86
|
:ID: 7ecaec5d-c656-44e1-8fad-185915655cee |
|
87
|
:END: |
|
88
|
*** Link Types |
|
89
|
:PROPERTIES: |
|
90
|
:ID: 6aedc026-36d0-4763-adc8-8ae1a79f1b3e |
|
91
|
:END: |
|
92
|
|
1
|
93
|
** Headings |
|
94
|
:PROPERTIES: |
|
95
|
:ID: ed035298-f7fa-4726-ad58-2d542323bb61 |
|
96
|
:END: |
0
|
97
|
In Org, headings can be summarize as any line starting with a star: =* |
|
98
|
H1=. Headings can be nested or 'demoted' by prepending another star: |
|
99
|
=** H2=. |
|
100
|
|
1
|
101
|
#+name: org-headings |
|
102
|
#+begin_src org |
|
103
|
,* H1 |
|
104
|
,** H2 |
|
105
|
,*** H3 |
|
106
|
,** H2 |
|
107
|
,* H1 |
|
108
|
#+end_src |
|
109
|
|
0
|
110
|
This is a useful pattern which we apply outside of Org - most commonly |
|
111
|
in our code comments. |
|
112
|
|
|
113
|
In our source code, we use the comment character instead of a star: |
1
|
114
|
#+name: lisp-headings |
0
|
115
|
#+begin_src lisp |
|
116
|
;;; foo |
|
117
|
(print "H1") ;; just an inline comment |
|
118
|
;;;; bar |
|
119
|
(print "H2") |
|
120
|
;;; baz |
|
121
|
(print "H1") |
|
122
|
#+end_src |
|
123
|
|
1
|
124
|
#+name: rust-headings |
|
125
|
#+begin_src rust |
|
126
|
/// foo |
|
127
|
println!("H1"); |
|
128
|
//// bar |
|
129
|
println!("H2"); |
|
130
|
/// baz |
|
131
|
println!("H1"); |
|
132
|
#+end_src |
|
133
|
|
0
|
134
|
** Keywords |
|
135
|
:PROPERTIES: |
|
136
|
:ID: 2cadda9a-22a3-4b42-ad4e-d7a774f74cba |
|
137
|
:END: |
|
138
|
|
6
|
139
|
TODO keywords are often used to keep track of the state of a [[https://orgmode.org/manual/TODO-Items.html][TODO |
|
140
|
Item]], but may also be [[https://orgmode.org/manual/TODO-Extensions.html][extended]] to support a variety of stateful item |
|
141
|
types beyond just simple tasks. |
1
|
142
|
|
6
|
143
|
The following keywords form the simple set of task states. |
0
|
144
|
|
6
|
145
|
- TBD |
|
146
|
- TODO |
|
147
|
- WIP |
|
148
|
- HOLD |
|
149
|
- WAIT |
|
150
|
- DONE |
|
151
|
- NOPE |
1
|
152
|
|
|
153
|
#+begin_src org |
|
154
|
,* PROJECT project |
|
155
|
,** DONE foo |
|
156
|
,** TODO bar |
6
|
157
|
,** TBD baz |
|
158
|
,** WIP test foo |
1
|
159
|
#+end_src |
|
160
|
|
|
161
|
** Tags |
0
|
162
|
:PROPERTIES: |
1
|
163
|
:ID: a7ae1b2a-559e-46e9-8cab-33e39a218288 |
0
|
164
|
:END: |
1
|
165
|
[[https://orgmode.org/manual/Tags.html][Tags]] are used liberally throughout our documents. They are simple |
|
166
|
strings usually following a headline as a =:=-separated list. |
0
|
167
|
|
1
|
168
|
A tag can be any text without newlines, although it is recommended to |
|
169
|
treat them as unique identifiers and usage of whitespace is |
|
170
|
discouraged (but not disallowed). |
6
|
171
|
|
|
172
|
#+begin_src org |
|
173
|
,* foobar :tag1:tag2:@home:!today |
|
174
|
#+end_src |
|
175
|
*** Tag Prefixes |
1
|
176
|
:PROPERTIES: |
|
177
|
:ID: b686dbc5-3505-49d7-b66a-0772bcf1a726 |
|
178
|
:END: |
6
|
179
|
Some of ourtags are prefixed with a character which indicates a |
|
180
|
special tag category: |
1
|
181
|
- =@= :: location-tag \\ |
|
182
|
A /location tag/ refers to some context-dependent named point in |
|
183
|
space, such as a user's home address, a popular fast food |
|
184
|
restaurant, or a specific room found in most houses. |
|
185
|
- =@home=, =@taco-bell=, =@bedroom= |
|
186
|
- =!= :: timestamp-tag \\ |
|
187
|
/Timestamp tags/ refer to some point in time, often named for |
|
188
|
convenience. You may use literal [[https://orgmode.org/manual/Timestamps.html][Timestamps]] too. Timestamp tags |
|
189
|
should not /directly reference/ scheduling information, doing so is |
|
190
|
often a code-smell. |
|
191
|
- =!now=, =!christmas=, =!someday= |
|
192
|
- =#= :: anchor-tag \\ |
|
193
|
An /anchor tag/ implies a link to the object identified by some [[id:3944c851-e46c-4d75-b8f5-07b5c052177a][ID]]. |
|
194
|
- =#readme=, =#a7ae1b2a-559e-46e9-8cab-33e39a218288=, =#custom-id= |
6
|
195
|
** Properties |
1
|
196
|
:PROPERTIES: |
6
|
197
|
:ID: 174a993b-a5dc-4324-b4f8-dda8101a55b7 |
1
|
198
|
:END: |
6
|
199
|
[[https://orgmode.org/manual/Properties-and-Columns.html][Properties]] are key:value pairs which are associated with a heading or |
|
200
|
file and stored in a dedicated [[https://orgmode.org/manual/Drawers.html][Drawer]]. |
|
201
|
|
|
202
|
#+begin_src org |
|
203
|
,* WIP do stuff :@lab: |
|
204
|
:PROPERTIES: |
|
205
|
:CREATED: <2024-08-24 Sat 19:09> |
|
206
|
:ID: 62da3982-7a83-4b27-ab7e-55949fd3e2a3 |
|
207
|
:EFFORT: 24:00 |
|
208
|
:END: |
|
209
|
#+end_src |
|
210
|
*** ID |
1
|
211
|
:PROPERTIES: |
6
|
212
|
:ID: 3944c851-e46c-4d75-b8f5-07b5c052177a |
1
|
213
|
:END: |
6
|
214
|
We reference two different types of identifiers in documentation: |
|
215
|
- UUID :: =ID= property |
|
216
|
- User-defined :: =CUSTOM_ID= property |
|
217
|
|
|
218
|
Most of the time these IDs don't add any information for the reader - |
|
219
|
the UUIDs are used to index and graph documents, CUSTOM_IDs are for |
|
220
|
convenience and extensions, but are rarely necessary given the many |
|
221
|
ways of identifying a headline. |
|
222
|
|
|
223
|
All headings are assigned an ID automatically and are never changed. |