Crates.io | impral |
lib.rs | impral |
version | 0.1.6 |
source | src |
created_at | 2021-09-15 17:47:18.773976 |
updated_at | 2022-06-17 13:11:49.230257 |
description | A command parsing and evaluation library for a LISP dialect, specialized for commandline input. |
homepage | https://github.com/Longor1996/impral |
repository | https://github.com/Longor1996/impral |
max_upload_size | |
id | 451929 |
size | 242,914 |
IMPRAL is a command parsing and evaluation library for a LISP-ish dialect, intended for reasonably ergonomic and specialized commandline input within larger applications, games and frameworks.
NOTICE:
Currently incomplete/still in development. Expect breaking changes.
Do not use in production code.
A very quick overview:
_
null
true
/ false
)0b…
, 0o…
, 0d…
, 0x…
U
.[ 1, 2, 3 ]
, commas optional){ a=1, b=2, c=3 }
, commas optional)0x[C0 +FF -EE]
)$
$$
$my-ref
@my-ref
A && B
: B
only runs if A
succeeds.A || B
: B
only runs if A
fails.+ - * / **
)== != < > <= >=
)? ! ~ ^ ++ --
)_.name
_[index]
=
after the dots._ .. _
and _ ..= _
|
… |? bar | …
… | … |? … | …
?
gets unwrapped to the default value.?!
will throw an error.foo _ _
foo bar=_ baz=_
(…)
A literal is a simple value, like a number, string, boolean, etc. etc.
Following is a list of possible literals:
null
.true
and false
. That's it.1337
-1
42.69
1.0e-5
0b101010
0xC0FFEE
_
and -
, always starting with at least one letter."Hello, World!"
[item1, item2, … itemN]
(the commas are optional!)list item1 item2 … itemN
{ key1: val1, key2: val2, …, keyN: valN}
There must be one or more
,
between the key-value pairs; there may be a,
before the}
.
dict key1 val1 key2 val2 … keyN valN
There are several types of reference:
@NAME
.$NAME
or $NUMBER
.$
.$$
.The language, like any Lisp does, consists of commands (function calls) stored as lists, where the first item in the list is a symbol, representing the name of the specific command to be evaluated followed by any number of positional arguments. Where things deviate is that IMPRAL supports named parameters, written after the positional arguments, for sake of convenience.
So, a command consists of three (and a half) parts:
The symbol identifying the command.
A unique bareword or any of the built-in operators.
Neither positional nor named arguments may be placed before the command identifier.
The positional arguments.
A whitespace separated list of values.
The named arguments.
A whitespace separated list of key=value
-pairs; the keys are always barewords.
Named arguments are required to be written after the positional arguments.
The only exception to this are continuation commands in the last position.
One may also write bool-arguments, consisting of a +
or -
and a bareword as name.
Continuation command. (optional)
Another command that is an extra positional parameter in the last position, written after a :
.
Command Delimiter. (optional)
If the parser encounters a ;
, it will stop parsing the current command,
regardless of what comes after the semicolon; useful for sequences?
To sum this up:
symbol arg1 arg2 … argN
symbol … kvarg1=val1 kvarg2=val2 … kvargN=valN
symbol … +kvarg -kvarg …
symbol … …: command
Expressions can be enclosed in parentheses, to be used within other expressions and as arguments for other commands: (…)
By writing two commands separated by &&
, the latter command will only be executed if the former succeeds, with the result being bound to $
: foo … && bar $ …
By separating them with ||
instead, the latter command will only be executed if the former fails: foo … || bar …
Both of the logical operators may be chained; evaluation will occur from left to right.
A sequence of expressions can be written as a pipe
, in which each stage passes it's result ($
) to the next one: players |? < $.health 50 | heal $
If a stage returns something iterable, that iterator will be evaluated and it's items be passed thru the pipe, instead of the iterator itself.
By using the _.FIELD
- and _[INDEX]
-syntax, subvalues may be accessed.
By typing two consecutive dots (..
and ..=
for right-inclusive), a range between/of two expressions can be created.
By using the ?
postfix-operator, one can convert the given value into a default value, if it's null
or an error. Adding an exclamation mark (?!
) makes the expression throw an error.
= …
: https://lib.rs/crates/pratt