eyelang 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -22
- package/docs/guide.md +12 -2
- package/package.json +1 -1
- package/test/run-regression.mjs +0 -20
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Eyelang
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/eyelang)
|
|
4
|
+
[](https://doi.org/10.5281/zenodo.20761726)
|
|
5
5
|
|
|
6
6
|
Eyelang is a small logic programming language for rules, goals, answers, and proofs.
|
|
7
7
|
Its source syntax is a deliberately small subset of ordinary Prolog term and Horn-clause syntax.
|
|
@@ -34,26 +34,6 @@ console.log(result.stdout);
|
|
|
34
34
|
- [Guide](docs/guide.md)
|
|
35
35
|
- [Language reference](docs/language-reference.md)
|
|
36
36
|
|
|
37
|
-
### Eyelang built-ins
|
|
38
|
-
|
|
39
|
-
The Eyelang engine has its own built-in registry under `src/builtins/`. Built-ins are called as ordinary Eyelang predicates. See the [Eyelang language reference](docs/language-reference.md#9-standard-built-in-predicates) for the portable profile. The bundled implementation currently registers 80 name/arity entries across 78 predicate names:
|
|
40
|
-
|
|
41
|
-
| Family | Count | Built-ins |
|
|
42
|
-
|---|---:|---|
|
|
43
|
-
| Core and host | 4 | `eq/2`, `neq/2`, `local_time/1`, `difference/3` |
|
|
44
|
-
| Arithmetic, comparison, and generators | 29 | `neg/2`, `abs/2`, `sin/2`, `cos/2`, `tan/2`, `asin/2`, `acos/2`, `sqrt/2`, `floor/2`, `ceiling/2`, `trunc/2`, `rounded/2`, `exp/2`, `log/2`, `add/3`, `sub/3`, `mul/3`, `div/3`, `mod/3`, `min/3`, `max/3`, `pow/3`, `atan2/3`, `lt/2`, `gt/2`, `le/2`, `ge/2`, `between/3`, `smallest_divisor_from/3` |
|
|
45
|
-
| Strings and conversions | 15 | `str_concat/3`, `contains/2`, `matches/2`, `matches/3`, `not_matches/2`, `split/3`, `join/3`, `substring/4`, `replace/4`, `lowercase/2`, `uppercase/2`, `trim/2`, `number_string/2`, `atom_string/2`, `term_string/2` |
|
|
46
|
-
| Lists | 19 | `append/3`, `nth0/3`, `set_nth0/4`, `head/2`, `rest/2`, `last/2`, `take/3`, `drop/3`, `slice/4`, `member/2`, `select/3`, `not_member/2`, `reverse/2`, `length/2`, `sum_list/2`, `min_list/2`, `max_list/2`, `list_to_set/2`, `sort/2` |
|
|
47
|
-
| Aggregation | 5 | `findall/3`, `countall/2`, `sumall/3`, `aggregate_min/5`, `aggregate_max/5` |
|
|
48
|
-
| Control | 3 | `not/1`, `once/1`, `forall/2` |
|
|
49
|
-
| Context and terms | 5 | `holds/2`, `holds/3`, `functor/3`, `arg/3`, `compound_name_arguments/3` |
|
|
50
|
-
| **Total** | **80** | |
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
## Custom built-ins
|
|
54
|
-
|
|
55
|
-
Custom built-ins can be supplied by creating a `BuiltinRegistry` and passing it to the solver or `run` API.
|
|
56
|
-
|
|
57
37
|
## Tests
|
|
58
38
|
|
|
59
39
|
```bash
|
package/docs/guide.md
CHANGED
|
@@ -238,9 +238,19 @@ The playground has matching `--stats` and `--proof` checkboxes, so browser runs
|
|
|
238
238
|
|
|
239
239
|
### Builtins
|
|
240
240
|
|
|
241
|
-
Eyelang builtins are registered by name and arity in small modules under [`src/builtins`](../src/builtins). This keeps the runtime portable to Node.js and the browser while giving each builtin family a clear boundary.
|
|
241
|
+
Eyelang builtins are registered by name and arity in small modules under [`src/builtins`](../src/builtins). This keeps the runtime portable to Node.js and the browser while giving each builtin family a clear boundary. Built-ins are called as ordinary Eyelang predicates. See the [Eyelang language reference](docs/language-reference.md#9-standard-built-in-predicates) for the portable profile. The bundled implementation currently registers 80 name/arity entries across 78 predicate names:
|
|
242
|
+
|
|
243
|
+
| Family | Count | Built-ins |
|
|
244
|
+
|---|---:|---|
|
|
245
|
+
| Core and host | 4 | `eq/2`, `neq/2`, `local_time/1`, `difference/3` |
|
|
246
|
+
| Arithmetic, comparison, and generators | 29 | `neg/2`, `abs/2`, `sin/2`, `cos/2`, `tan/2`, `asin/2`, `acos/2`, `sqrt/2`, `floor/2`, `ceiling/2`, `trunc/2`, `rounded/2`, `exp/2`, `log/2`, `add/3`, `sub/3`, `mul/3`, `div/3`, `mod/3`, `min/3`, `max/3`, `pow/3`, `atan2/3`, `lt/2`, `gt/2`, `le/2`, `ge/2`, `between/3`, `smallest_divisor_from/3` |
|
|
247
|
+
| Strings and conversions | 15 | `str_concat/3`, `contains/2`, `matches/2`, `matches/3`, `not_matches/2`, `split/3`, `join/3`, `substring/4`, `replace/4`, `lowercase/2`, `uppercase/2`, `trim/2`, `number_string/2`, `atom_string/2`, `term_string/2` |
|
|
248
|
+
| Lists | 19 | `append/3`, `nth0/3`, `set_nth0/4`, `head/2`, `rest/2`, `last/2`, `take/3`, `drop/3`, `slice/4`, `member/2`, `select/3`, `not_member/2`, `reverse/2`, `length/2`, `sum_list/2`, `min_list/2`, `max_list/2`, `list_to_set/2`, `sort/2` |
|
|
249
|
+
| Aggregation | 5 | `findall/3`, `countall/2`, `sumall/3`, `aggregate_min/5`, `aggregate_max/5` |
|
|
250
|
+
| Control | 3 | `not/1`, `once/1`, `forall/2` |
|
|
251
|
+
| Context and terms | 5 | `holds/2`, `holds/3`, `functor/3`, `arg/3`, `compound_name_arguments/3` |
|
|
252
|
+
| **Total** | **80** | |
|
|
242
253
|
|
|
243
|
-
The builtin families cover unification, arithmetic, comparison, dates, strings, lists, aggregation, context terms, term inspection, and search control. Domain-specific number-theory and matrix helper modules were removed from the default registry because those predicates were examples/accelerators rather than a reusable portable surface. New reusable helpers cover common numeric functions, list slicing and summaries, string normalization/conversion, term inspection/construction, and `forall/2`. The complete bundled implementation list is kept in the top-level [README built-ins section](../README.md#built-ins-1), and the regression suite checks that table against the actual runtime registry.
|
|
244
254
|
|
|
245
255
|
To add a builtin, create or extend a module with `register(registry)` and call `registry.add(name, arity, handler, options)`. The default registry is assembled in [`src/builtins/registry.js`](../src/builtins/registry.js). Builtins that are only safe for specific argument modes should provide a `ready` predicate and `fallbackWhenNotReady: true`, so user-defined clauses remain visible until the builtin is applicable.
|
|
246
256
|
|
package/package.json
CHANGED
package/test/run-regression.mjs
CHANGED
|
@@ -188,26 +188,6 @@ why(
|
|
|
188
188
|
assertEqual(result.stderr, '', 'stderr');
|
|
189
189
|
},
|
|
190
190
|
},
|
|
191
|
-
{
|
|
192
|
-
name: 'README covers every mirrored example',
|
|
193
|
-
run: () => {
|
|
194
|
-
const examples = listExampleNames();
|
|
195
|
-
const readmeExamples = readmeCatalogExampleNames();
|
|
196
|
-
assertEqual(readmeExamples.join('\n'), examples.join('\n'), 'README example catalog');
|
|
197
|
-
},
|
|
198
|
-
},
|
|
199
|
-
{
|
|
200
|
-
name: 'README mirrors the Eyelang builtin registry',
|
|
201
|
-
run: () => {
|
|
202
|
-
const actual = registeredBuiltinNames();
|
|
203
|
-
const documented = readmeBuiltinNames();
|
|
204
|
-
assertEqual(documented.join('\n'), actual.join('\n'), 'README builtin catalog');
|
|
205
|
-
|
|
206
|
-
const { entries, names } = readmeBuiltinSummary();
|
|
207
|
-
assertEqual(entries, actual.length, 'README builtin entry count');
|
|
208
|
-
assertEqual(names, new Set(actual.map((item) => item.split('/')[0])).size, 'README builtin name count');
|
|
209
|
-
},
|
|
210
|
-
},
|
|
211
191
|
{
|
|
212
192
|
name: 'stdin input is accepted',
|
|
213
193
|
run: () => {
|