better readme
This commit is contained in:
parent
6a4566c223
commit
dd02cc1fc4
1 changed files with 42 additions and 0 deletions
42
README.md
42
README.md
|
@ -11,6 +11,9 @@ func main { mega | with args ;
|
||||||
&print swap:foreach
|
&print swap:foreach
|
||||||
"" println
|
"" println
|
||||||
println<"and with that, we're done">
|
println<"and with that, we're done">
|
||||||
|
[ ^hello ^pattern-matching ] => [ ^hello &=args ] if {
|
||||||
|
args println "prints pattern-matching";
|
||||||
|
}
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
@ -262,3 +265,42 @@ As you can see, it's relatively straight-forward to do; but there are some major
|
||||||
The second one is easy to fix, but I intend to fix the first one first. Sadly, fixing it requires
|
The second one is easy to fix, but I intend to fix the first one first. Sadly, fixing it requires
|
||||||
compiling the code as a dynamic library and also getting it to work with the program its running in.
|
compiling the code as a dynamic library and also getting it to work with the program its running in.
|
||||||
If anyone knows how to do this properly, I'd REALLY appreciate a PR or issue explaining it.
|
If anyone knows how to do this properly, I'd REALLY appreciate a PR or issue explaining it.
|
||||||
|
|
||||||
|
## Syntactic sugar
|
||||||
|
|
||||||
|
There's a lot of things that look kinda tedious to do in SPL, syntactically speaking. So over time,
|
||||||
|
I regularly add syntactic sugar:
|
||||||
|
|
||||||
|
- `a => b` -> `a b match`
|
||||||
|
- `a =>? b` -> `a dup b match _'match-else-push` (match that will push the offending value on error)
|
||||||
|
- `a =>! b` -> `a b match _'match-else-error` (match that throws an error when unable to match)
|
||||||
|
- `a<| b c d e>` -> `a<{ | b c d e }>` -> `{ | b c d e } a`
|
||||||
|
- `def a, b, c` -> `def a def b def c`
|
||||||
|
|
||||||
|
## Matching
|
||||||
|
|
||||||
|
The match function `match` and its accompanying sugar take in two values and essentially do a special
|
||||||
|
compare for equality on them. Unlike everything else, which is just compared normally, arrays are
|
||||||
|
iterated through and their items checked individually, recursively. When a callable (`{ ... | ... }`)
|
||||||
|
is found in b, any value in a is accepted for it, and the function is called *if and only if* every
|
||||||
|
other part of the match also succeeds.
|
||||||
|
The function returns 1 on success, otherwise 0.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```js
|
||||||
|
def a, val
|
||||||
|
[ ^ok "hey matcher" ] =a
|
||||||
|
|
||||||
|
a =>! [ ^ok &=val ]
|
||||||
|
val println
|
||||||
|
|
||||||
|
a =>? [ ^ok &=val ] not if {
|
||||||
|
"error: " swap concat panic
|
||||||
|
}
|
||||||
|
val println
|
||||||
|
|
||||||
|
a => [ ^ok &=val ] not if {
|
||||||
|
"error" panic
|
||||||
|
}
|
||||||
|
val println
|
||||||
|
```
|
||||||
|
|
Loading…
Add table
Reference in a new issue