summaryrefslogtreecommitdiffhomepage
path: root/pogo.html.markdown
blob: 6c619e0bd4b5ed99a5faabcd3e557b7043372c83 (plain)
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
---
language: pogoscript
contributors:
    - ["Tim Macfarlane", "http://github.com/refractalize"]
filename: learnPogo.pogo
---

Pogoscript is a little language that emphasises readability, DSLs and provides excellent asynchronous primitives for writing connected JavaScript applications for the browser or server.

# variables

defining a variable

```
water temperature = 24
```

re-assigning a variable after its definition

```
water temperature := 26
```

## functions

functions allow their parameters to be placed anywhere

```
temperature at (altitude) altitude = 32 - altitude / 100
```

longer functions are just indented

```
temperature at (altitude) altitude :=
    if (altitude < 0)
        water temperature
    else
        32 - altitude / 100
```

calling a function

```
current temperature = temperature at 3200 altitude
```

## objects and methods
this function constructs a new object

```
position (x, y) = {
    x = x
    y = y

    distance from position (p) =
        dx = self.x - p.x
        dy = self.y - p.y
        Math.sqrt (dx * dx + dy * dy)
}
```

calling methods

```
position (7, 2).distance from position (position (5, 1))
```

as in JavaScript, objects are hashes too

```
position.'x' == position.x == position.('x')
```

## arrays

```
positions = [
    position (1, 1)
    position (1, 2)
    position (1, 3)
]
```

indexing an array

```
positions.0.y

n = 2
positions.(n).y
```

## strings

```
poem = 'Tail turned to red sunset on a juniper crown a lone magpie cawks.
        Mad at Oryoki in the shrine-room -- Thistles blossomed late afternoon.
        Put on my shirt and took it off in the sun walking the path to lunch.
        A dandelion seed floats above the marsh grass with the mosquitos.
        At 4 A.M. the two middleaged men sleeping together holding hands.
        In the half-light of dawn a few birds warble under the Pleiades.
        Sky reddens behind fir trees, larks twitter, sparrows cheep cheep cheep
        cheep cheep.'

// Allen Ginsburg
```

interpolation

```
outlook = 'amazing!'
console.log "the weather tomorrow is going to be #(outlook)"
```

## regular expressions

```
r/(\d+)m/
```

## operators

```
true @and true
false @or true
@not false
2 < 4
2 >= 2
2 > 1

// plus all the javascript ones
```

to define your own

```
(p1) plus (p2) =
    position (p1.x + p2.x, p1.y + p2.y)
```

can be called as an operator

```
position (1, 1) @plus position (0, 2)
```

or as a function

```
(position (1, 1)) plus (position (0, 2))
```

explicit return

```
(x) times (y) = return (x * y)
```

new

```
now = @new Date ()
```

# more on functions

functions can take named optional arguments

```
spark (position, color: 'black', velocity: {x = 0, y = 0}) = {
    color = color
    position = position
    velocity = velocity
}

red = spark (position 1 1, color: 'red')
fast black = spark (position 1 1, velocity: {x = 10, y = 0})
```

functions can unsplat arguments too

```
log (messages, ...) =
    console.log (messages, ...)
```

## blocks

blocks are functions passed to other functions. This block takes two parameters, `spark` and `c`,
the body of the block is the indented code after the function call

```
render each @(spark) into canvas context @(c)
    ctx.begin path ()
    ctx.stroke style = spark.color
    ctx.arc (
        spark.position.x + canvas.width / 2
        spark.position.y
        3
        0
        Math.PI * 2
    )
    ctx.stroke ()
```

## asynchronous calls

Node.js includes the `fs` module for accessing the file system.
Let's list the contents of a directory

```
fs = require 'fs'
directory listing = fs.readdir! '.'
```

`fs.readdir()` is an asynchronous function, so we can call it using the `!` operator.
The `!` operator allows you to call async functions with the same syntax and largely
the same semantics as normal synchronous functions.
Pogoscript rewrites it so that all subsequent code is placed in the callback function
to `fs.readdir()`.

to catch asynchronous errors while calling asynchronous functions

```
try
    another directory listing = fs.readdir! 'a-missing-dir'
catch (ex)
    console.log (ex)
```

in fact, if you don't use `try catch`, it will raise the error up the
stack to the outer-most `try catch` or to the event loop, as you'd expect
with non-async exceptions

to run two asynchronous calls concurrently, use the `?` operator.
The `?` operator returns a *future* which can be executed to
wait for and obtain the result, again using the `!` operator

we don't wait for either of these calls to finish

```
a = fs.stat? 'a.txt'
b = fs.stat? 'b.txt'
```

now we wait for the calls to finish and print the results

```
console.log "size of a.txt is #(a!.size)"
console.log "size of b.txt is #(b!.size)"
```

That's it.

Download [Node.js](http://nodejs.org/) and `npm install pogo`.

There is plenty of documentation on [http://pogoscript.org/](http://pogoscript.org/), inlcuding a [cheat sheet](http://pogoscript.org/cheatsheet.html), a [guide](http://pogoscript.org/guide/), and how [Pogoscript translates to Javascript](http://featurist.github.io/pogo-examples/). Get in touch on the [google group](http://groups.google.com/group/pogoscript) if you have questions!