update built-in examples to use newly introduced syntax
This commit is contained in:
parent
b5cdfdb1b6
commit
914da923f7
4 changed files with 53 additions and 55 deletions
|
@ -603,29 +603,19 @@ fn is_prefix_token((kind, spaces): (TokenKind, Spaces)) -> bool {
|
|||
}
|
||||
|
||||
fn prefix(p: &mut Parser) -> Closed {
|
||||
let (kind, spaces) = p.peek_with_spaces();
|
||||
match kind {
|
||||
match p.peek() {
|
||||
TokenKind::Ident => one(p, NodeKind::Ident),
|
||||
TokenKind::Tag => one(p, NodeKind::Tag),
|
||||
TokenKind::Number => one(p, NodeKind::Number),
|
||||
TokenKind::Color => one(p, NodeKind::Color),
|
||||
TokenKind::LBrack => list(p),
|
||||
|
||||
TokenKind::Minus if spaces.pair() == (true, false) => unary(p),
|
||||
TokenKind::Minus => unary(p),
|
||||
TokenKind::Not => unary(p),
|
||||
TokenKind::LParen => paren(p),
|
||||
TokenKind::Backslash => lambda(p),
|
||||
TokenKind::If => if_expr(p),
|
||||
|
||||
TokenKind::Minus if spaces.pair() == (false, true) => {
|
||||
let span = p.span();
|
||||
p.emit(Diagnostic::error(
|
||||
span,
|
||||
"`-` operator must be surrounded by an equal amount of spaces",
|
||||
));
|
||||
p.advance_with_error()
|
||||
}
|
||||
|
||||
_ => {
|
||||
assert!(
|
||||
!is_prefix_token(p.peek_with_spaces()),
|
||||
|
|
|
@ -28,8 +28,6 @@ pub enum TokenKind {
|
|||
Greater,
|
||||
GreaterEqual,
|
||||
Not,
|
||||
Dot,
|
||||
Pipe,
|
||||
|
||||
// Punctuation
|
||||
Newline,
|
||||
|
@ -42,6 +40,8 @@ pub enum TokenKind {
|
|||
Colon,
|
||||
Backslash,
|
||||
RArrow,
|
||||
Dot,
|
||||
Pipe,
|
||||
|
||||
// Keywords
|
||||
Underscore,
|
||||
|
|
49
docs/rkgk.dj
49
docs/rkgk.dj
|
@ -1,5 +1,15 @@
|
|||
# Introduction to rakugaki
|
||||
|
||||
*Warning: Neither rakugaki, nor this introductory manual is finished.*
|
||||
While it will always use the most up-to-date and recommended syntax, there are things it does cover, and it will probably be rebuilt to improve coverage of features once the app stabilises a bit.
|
||||
|
||||
For now, I recommend cross-referencing it with the following documents:
|
||||
|
||||
- [haku language reference](haku.html)
|
||||
- [System library](system.html)
|
||||
|
||||
---
|
||||
|
||||
Welcome to rakugaki!
|
||||
|
||||
I hope you've been having fun fiddling with the app so far.
|
||||
|
@ -28,7 +38,7 @@ In case you edited anything in the input box on the right, paste the following t
|
|||
-- and see what happens!
|
||||
|
||||
withDotter \d ->
|
||||
stroke 8 #000 (d To)
|
||||
stroke 8 #000 d.To
|
||||
```
|
||||
|
||||
rakugaki is a drawing program for digital scribbles and other pieces of art.
|
||||
|
@ -86,8 +96,8 @@ If you want to draw multiple scribbles, you can wrap them into a list, which we
|
|||
-- Draw two colorful dots instead of one!
|
||||
withDotter \d ->
|
||||
[
|
||||
stroke 8 #F00 (d To + vec 4 0)
|
||||
stroke 8 #00F (d To + vec -4 0)
|
||||
stroke 8 #F00 (d.To + vec 4 0)
|
||||
stroke 8 #00F (d.To + vec -4 0)
|
||||
]
|
||||
```
|
||||
|
||||
|
@ -108,12 +118,12 @@ It'll draw the first inner list, which contains two scribbles, and then it'll dr
|
|||
withDotter \d ->
|
||||
[
|
||||
[
|
||||
stroke 8 #F00 (d To + vec 4 0)
|
||||
stroke 8 #00F (d To + vec -4 0)
|
||||
stroke 8 #F00 (d.To + vec 4 0)
|
||||
stroke 8 #00F (d.To + vec -4 0)
|
||||
]
|
||||
[
|
||||
stroke 8 #FF0 (d To + vec 0 4)
|
||||
stroke 8 #0FF (d To + vec 0 -4)
|
||||
stroke 8 #FF0 (d.To + vec 0 4)
|
||||
stroke 8 #0FF (d.To + vec 0 -4)
|
||||
]
|
||||
]
|
||||
```
|
||||
|
@ -136,7 +146,7 @@ Recall that super simple brush from before...
|
|||
|
||||
```haku
|
||||
withDotter \d ->
|
||||
stroke 8 #000 (d To)
|
||||
stroke 8 #000 d.To
|
||||
```
|
||||
|
||||
This reads as "given a dotter, output a stroke that's 8 pixels wide, has the color `#000`, and is drawn at the dotter's `To` coordinates."
|
||||
|
@ -169,6 +179,7 @@ If you reorder or remove any one of them, your brush isn't going to work!
|
|||
You can also specify an alpha channel, for transparent colors---`#RRGGBBAA`, or `#RGBA`.
|
||||
|
||||
- The third ingredient is the stroke's _position_.
|
||||
`d.To` is the position of your mouse cursor.
|
||||
|
||||
Positions in haku are represented using mathematical _vectors_, which, when broken down into pieces, are just lists of some numbers.
|
||||
|
||||
|
@ -187,22 +198,22 @@ Likewise, negative X coordinates go leftwards, and negative Y coordinates go upw
|
|||
|
||||
---
|
||||
|
||||
Vectors in haku are obtained with another function---`vec`---though we don't use it in the basic example, because `d To` already is a vector.
|
||||
Vectors support all the usual math operators though, so if we wanted to, we could, for example, add a vector to `d To`, thus moving the position of the dot relative to the mouse cursor:
|
||||
Vectors in haku are obtained with another function---`vec`---though we don't use it in the basic example, because `d.To` already is a vector.
|
||||
Vectors support all the usual math operators though, so if we wanted to, we could, for example, add a vector to `d.To`, thus moving the position of the dot relative to the mouse cursor:
|
||||
|
||||
```haku
|
||||
withDotter \d ->
|
||||
stroke 8 #000 (d To + vec 10 0) -- moved 10 pixels rightwards
|
||||
stroke 8 #000 (d.To + vec 10 0) -- moved 10 pixels rightwards
|
||||
```
|
||||
|
||||
Also note how the `d To + vec 10 0` expression is parenthesized.
|
||||
Also note how the `d.To + vec 10 0` expression is parenthesized.
|
||||
This is because otherwise, its individual parts would be interpreted as separate arguments to `stroke`, which is not what we want!
|
||||
|
||||
Anyways, with all that, we let haku mix all the ingredients together, and get a black dot under the cursor.
|
||||
|
||||
```haku
|
||||
withDotter \d ->
|
||||
stroke 8 #000 (d To)
|
||||
stroke 8 #000 d.To
|
||||
```
|
||||
|
||||
Nice!
|
||||
|
@ -221,10 +232,10 @@ Let's fix that by drawing a `line` instead!
|
|||
|
||||
```haku
|
||||
withDotter \d ->
|
||||
stroke 8 #000 (line (d From) (d To))
|
||||
stroke 8 #000 (line d.From d.To)
|
||||
```
|
||||
|
||||
We replace the singular position `d To` with a `line`. `line` expects two arguments, which are vectors defining the line's start and end points.
|
||||
We replace the singular position `d.To` with a `line`. `line` expects two arguments, which are vectors defining the line's start and end points.
|
||||
For the starting position we use a _different_ property of `d`, which is `From`---this is the _previous_ value of `To`, which allows us to draw a continuous line.
|
||||
|
||||
::: aside
|
||||
|
@ -239,8 +250,8 @@ haku also supports other kinds of shapes: circles and rectangles.
|
|||
```haku
|
||||
withDotter \d ->
|
||||
[
|
||||
stroke 8 #F00 (circle (d To + vec -16 0) 16)
|
||||
stroke 8 #00F (rect (d To + vec 0 -16) (vec 32 32))
|
||||
stroke 8 #F00 (circle (d.To + vec -16 0) 16)
|
||||
stroke 8 #00F (rect (d.To + vec 0 -16) (vec 32 32))
|
||||
]
|
||||
```
|
||||
|
||||
|
@ -292,13 +303,15 @@ In fact, here's the full order of operations in haku for reference:
|
|||
|
||||
1. Tight
|
||||
|
||||
1. Function applications: `.`
|
||||
1. Arithmetic: `+`, `-`, `*`, `/`
|
||||
1. Comparisons: `==`, `!=`, `<`, `<=`, `>`, `>=`
|
||||
|
||||
1. Function calls
|
||||
1. Loose
|
||||
|
||||
1. Arithmetic
|
||||
1. Function applications: `.`
|
||||
1. Arithmetic and pipelines `|`
|
||||
1. Comparisons
|
||||
1. Variables: `:`, `=`
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@ color: #000
|
|||
thickness: 8
|
||||
|
||||
withDotter \\d ->
|
||||
stroke thickness color (line (d From) (d To))
|
||||
stroke thickness color (line d.From d.To)
|
||||
`.trim(),
|
||||
},
|
||||
|
||||
|
@ -27,7 +27,7 @@ color: #000
|
|||
thickness: 48
|
||||
|
||||
withDotter \\d ->
|
||||
stroke thickness color (line (d From) (d To))
|
||||
stroke thickness color (line d.From d.To)
|
||||
`.trim(),
|
||||
},
|
||||
|
||||
|
@ -40,14 +40,10 @@ thickness: 4
|
|||
length: 5
|
||||
duty: 0.5
|
||||
|
||||
or_: \\a, b ->
|
||||
if (a) a
|
||||
else b
|
||||
|
||||
withDotter \\d ->
|
||||
visible? = mod (d Num) length < length * duty
|
||||
visible? = d.Num |mod length < length * duty
|
||||
if (visible?)
|
||||
stroke thickness color (line (d From) (d To))
|
||||
stroke thickness color (line d.From d.To)
|
||||
else
|
||||
()
|
||||
`.trim(),
|
||||
|
@ -61,7 +57,7 @@ color: #0003
|
|||
thickness: 6
|
||||
|
||||
withDotter \\d ->
|
||||
stroke thickness color (line (d From) (d To))
|
||||
stroke thickness color (line d.From d.To)
|
||||
`.trim(),
|
||||
},
|
||||
|
||||
|
@ -76,10 +72,10 @@ wavelength: 1
|
|||
|
||||
withDotter \\d ->
|
||||
pi = 3.14159265
|
||||
a = sin (d Num * wavelength / pi) + 1 / 2
|
||||
a = sin (d.Num * wavelength / pi) + 1 / 2
|
||||
range = maxThickness - minThickness
|
||||
thickness = a * range + minThickness
|
||||
stroke thickness color (line (d From) (d To))
|
||||
stroke thickness color (line d.From d.To)
|
||||
`.trim(),
|
||||
},
|
||||
|
||||
|
@ -93,22 +89,21 @@ amplitude: 50
|
|||
wavelength: 1
|
||||
|
||||
mag: \\v ->
|
||||
hypot (vecX v) (vecY v)
|
||||
hypot vecX.v vecY.v
|
||||
|
||||
norm: \\u ->
|
||||
l = mag u
|
||||
u / vec l l
|
||||
|
||||
perpClockwise: \\v ->
|
||||
vec (vecY v) -(vecX v)
|
||||
vec vecY.v -(vecX.v)
|
||||
|
||||
withDotter \\d ->
|
||||
pi = 3.14159265
|
||||
a = sin (d Num * wavelength / pi) * amplitude
|
||||
direction = (d To) - (d From)
|
||||
clockwise = norm (perpClockwise direction) * vec a a
|
||||
from = d From + clockwise
|
||||
to = d To + clockwise
|
||||
a = sin (d.Num * wavelength / pi) * amplitude
|
||||
clockwise = norm (perpClockwise d.To-d.From) * vec a a
|
||||
from = d.From + clockwise
|
||||
to = d.To + clockwise
|
||||
stroke thickness color (line from to)
|
||||
`.trim(),
|
||||
},
|
||||
|
@ -121,16 +116,16 @@ wavelength: 0.1
|
|||
thickness: 8
|
||||
|
||||
colorCurve: \\n ->
|
||||
abs (cos n)
|
||||
n |cos |abs
|
||||
|
||||
withDotter \\d ->
|
||||
pi = 3.14159265
|
||||
l = wavelength
|
||||
r = colorCurve (d Num * l)
|
||||
g = colorCurve (d Num * l + pi/3)
|
||||
b = colorCurve (d Num * l + 2*pi/3)
|
||||
r = colorCurve (d.Num * l)
|
||||
g = colorCurve (d.Num * l + pi/3)
|
||||
b = colorCurve (d.Num * l + 2*pi/3)
|
||||
color = rgba r g b 1
|
||||
stroke thickness color (line (d From) (d To))
|
||||
stroke thickness color (line d.From d.To)
|
||||
`.trim(),
|
||||
},
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue