@fraczak/k 6.1.2 → 6.1.3
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/DOCS/BIG_PICTURE.md +10 -10
- package/DOCS/DIVERGENCE_DETECTION.md +1 -1
- package/DOCS/TYPE_DERIVATION.md +12 -12
- package/DOCS/book/01-introduction.md +2 -2
- package/DOCS/book/02-syntax-and-values.md +8 -8
- package/DOCS/book/03-types-as-finite-automata.md +2 -2
- package/DOCS/book/04-partial-functions-and-composition.md +2 -2
- package/DOCS/book/05-typing-filters-and-normalization.md +3 -3
- package/DOCS/book/06-values-in-memory.md +3 -3
- package/DOCS/book/07-the-partial-function-abi.md +1 -1
- package/DOCS/book/08-operational-semantics-and-execution.md +1 -1
- package/DOCS/book/09-compiler-architecture.md +2 -2
- package/DOCS/book/appendix-b-incorporating-external-predefined-types-and-functions.md +1 -0
- package/README.md +7 -8
- package/a.k +138 -0
- package/a.klib +1 -0
- package/codecs/BINARY_FORMAT.md +1 -1
- package/codecs/POLYMORPHIC_BINARY_FORMAT.md +1 -1
- package/codes.mjs +14 -33
- package/export.mjs +3 -3
- package/ieee.klib +1 -1
- package/nak.klib +1 -0
- package/nak2.klib +1 -0
- package/nat.k +10 -0
- package/nat2.k +9 -0
- package/object.mjs +20 -7
- package/package.json +2 -1
- package/scripts/benchmark-idempotency.mjs +72 -0
- package/test-k-object.mjs +19 -0
package/nak.klib
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"format":"k-object","codes":{"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c":{"code":"product","product":{},"def":"$C0={};"},"@w8iSHeQQE738vEmWNGja3FQWk3XuExQKZ2pbm8ApEdkF":{"code":"union","union":{"zero":"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c","succ":"@w8iSHeQQE738vEmWNGja3FQWk3XuExQKZ2pbm8ApEdkF"},"def":"$C0=<C0\"succ\",C1\"zero\">;$C1={};"}},"rels":{"@p5vX3t22gqMxGDRMngp7bGmHwhxZT5hXHFVb862a2kvM":{"def":{"op":"comp","comp":[{"op":"product","product":[],"patterns":[0,1]},{"op":"vid","vid":"zero","patterns":[1,2]}],"patterns":[0,2]},"typeDerivation":{"status":"converged"},"typePatternGraph":{"patterns":{"nodes":[{"pattern":"(...)","fields":[]},{"pattern":"type","type":"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c"},{"pattern":"<...>","fields":["zero"]}],"parent":[]},"edges":[{},{},{"zero":[1]}],"codeId":{"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c":1}}},"@nXXqMAi2PVsBzSN2KidWgg74hYhBbHQt5hw5TgPKvEy5":{"def":{"op":"comp","comp":[{"op":"product","product":[{"label":"if","exp":{"op":"div","div":"zero","patterns":[2,1]}},{"label":"then","exp":{"op":"identity","patterns":[2,2]}}],"patterns":[2,0]},{"op":"dot","dot":"then","patterns":[0,2]}],"patterns":[2,2]},"typeDerivation":{"status":"converged"},"typePatternGraph":{"patterns":{"nodes":[{"pattern":"{}","fields":["if","then"],"rule":"comp:chain"},{"pattern":"(...)","fields":[]},{"pattern":"<...>","fields":["zero"],"rule":"comp:chain."}],"parent":[]},"edges":[{"if":[1],"then":[2]},{},{"zero":[1]}],"codeId":{}}},"@SwjzXdcxv8ZbpCkF4cXGtgKkqPTfYqGGP5erQE7DCCsj":{"def":{"op":"vid","vid":"succ","patterns":[0,1]},"typeDerivation":{"status":"converged"},"typePatternGraph":{"patterns":{"nodes":[{"pattern":"(...)","fields":[]},{"pattern":"<...>","fields":["succ"]}],"parent":[]},"edges":[{},{"succ":[0]}],"codeId":{}}},"@mKEAm5rV7BDCh244NfCQgYE8wbEqbQMN3dbbPqBPg393":{"def":{"op":"union","union":[{"op":"comp","comp":[{"op":"product","product":[{"label":"x","exp":{"op":"comp","comp":[{"op":"dot","dot":"x","patterns":[0,1]},{"op":"div","div":"succ","patterns":[1,1]}],"patterns":[0,1]}},{"label":"y","exp":{"op":"comp","comp":[{"op":"dot","dot":"y","patterns":[0,2]},{"op":"ref","ref":"@SwjzXdcxv8ZbpCkF4cXGtgKkqPTfYqGGP5erQE7DCCsj","patterns":[2,2]}],"patterns":[0,2]}}],"patterns":[0,0]},{"op":"ref","ref":"@mKEAm5rV7BDCh244NfCQgYE8wbEqbQMN3dbbPqBPg393","patterns":[0,2]}],"patterns":[0,2]},{"op":"dot","dot":"y","patterns":[0,2]}],"patterns":[0,2]},"typeDerivation":{"status":"converged"},"typePatternGraph":{"patterns":{"nodes":[{"pattern":"{}","fields":["x","y"],"rule":"ref:input add(add)"},{"pattern":"<...>","fields":["succ"],"rule":"ref:input add(add)."},{"pattern":"<...>","fields":["succ"],"rule":"ref:input add(add)."}],"parent":[]},"edges":[{"x":[1],"y":[2]},{"succ":[1]},{"succ":[2]}],"codeId":{}}},"@2BBEqu8VuB2NPE89pNNCe9hPbmesi5JFSUQmGgnSRchp":{"def":{"op":"union","union":[{"op":"comp","comp":[{"op":"union","union":[{"op":"comp","comp":[{"op":"dot","dot":"x","patterns":[1,3]},{"op":"ref","ref":"@nXXqMAi2PVsBzSN2KidWgg74hYhBbHQt5hw5TgPKvEy5","patterns":[3,3]}],"patterns":[1,3]},{"op":"comp","comp":[{"op":"dot","dot":"y","patterns":[1,3]},{"op":"ref","ref":"@nXXqMAi2PVsBzSN2KidWgg74hYhBbHQt5hw5TgPKvEy5","patterns":[3,3]}],"patterns":[1,3]}],"patterns":[1,3]},{"op":"ref","ref":"@p5vX3t22gqMxGDRMngp7bGmHwhxZT5hXHFVb862a2kvM","patterns":[3,3]}],"patterns":[1,3]},{"op":"comp","comp":[{"op":"product","product":[{"label":"x","exp":{"op":"comp","comp":[{"op":"product","product":[{"label":"x","exp":{"op":"comp","comp":[{"op":"dot","dot":"x","patterns":[1,3]},{"op":"div","div":"succ","patterns":[3,3]}],"patterns":[1,3]}},{"label":"y","exp":{"op":"dot","dot":"y","patterns":[1,3]}}],"patterns":[1,0]},{"op":"ref","ref":"@2BBEqu8VuB2NPE89pNNCe9hPbmesi5JFSUQmGgnSRchp","patterns":[0,3]}],"patterns":[1,3]}},{"label":"y","exp":{"op":"dot","dot":"y","patterns":[1,3]}}],"patterns":[1,0]},{"op":"ref","ref":"@mKEAm5rV7BDCh244NfCQgYE8wbEqbQMN3dbbPqBPg393","patterns":[0,3]}],"patterns":[1,3]}],"patterns":[1,3]},"typeDerivation":{"status":"converged"},"typePatternGraph":{"patterns":{"nodes":[{"pattern":"{}","fields":["x","y"],"rule":"ref:input mult(mult)"},{"pattern":"{...}","fields":["x","y"],"rule":"union:input"},{"pattern":"type","type":"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c"},{"pattern":"<...>","fields":["succ","zero"],"rule":"ref:input mult(add)."}],"parent":[]},"edges":[{"x":[3],"y":[3]},{"x":[3],"y":[3]},{},{"succ":[3],"zero":[2]}],"codeId":{"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c":2}}}},"relAlias":{"zero?":"@nXXqMAi2PVsBzSN2KidWgg74hYhBbHQt5hw5TgPKvEy5","zero":"@p5vX3t22gqMxGDRMngp7bGmHwhxZT5hXHFVb862a2kvM","succ":"@SwjzXdcxv8ZbpCkF4cXGtgKkqPTfYqGGP5erQE7DCCsj","add":"@mKEAm5rV7BDCh244NfCQgYE8wbEqbQMN3dbbPqBPg393","mult":"@2BBEqu8VuB2NPE89pNNCe9hPbmesi5JFSUQmGgnSRchp","__main__":"@227p5FPVzZxF4qFe77EaaQNFyMPU5xSbpHWz6vaEwmrN"},"compileStats":{"sccs":[{"members":["zero?"],"strategy":"single_pass","iterations":1,"converged":true},{"members":["zero"],"strategy":"single_pass","iterations":1,"converged":true},{"members":["succ"],"strategy":"single_pass","iterations":1,"converged":true},{"members":["add"],"strategy":"fixed_point","iterations":2,"converged":true},{"members":["mult"],"strategy":"fixed_point","iterations":2,"converged":true},{"members":["__main__"],"strategy":"single_pass","iterations":1,"converged":true}],"sccCount":6},"meta":{"@w8iSHeQQE738vEmWNGja3FQWk3XuExQKZ2pbm8ApEdkF":{"type":"code","origins":[{"source":"Examples/nat.k","name":"nat","compiledAt":"2026-05-29T01:54:22.928Z","start":{"line":1,"column":9},"end":{"line":1,"column":30}}]},"@nXXqMAi2PVsBzSN2KidWgg74hYhBbHQt5hw5TgPKvEy5":{"type":"rel","origins":[{"source":"Examples/nat.k","name":"zero?","compiledAt":"2026-05-29T01:54:22.928Z","start":{"line":3,"column":9},"end":{"line":3,"column":34}}]},"@p5vX3t22gqMxGDRMngp7bGmHwhxZT5hXHFVb862a2kvM":{"type":"rel","origins":[{"source":"Examples/nat.k","name":"zero","compiledAt":"2026-05-29T01:54:22.928Z","start":{"line":2,"column":8},"end":{"line":2,"column":17}}]},"@SwjzXdcxv8ZbpCkF4cXGtgKkqPTfYqGGP5erQE7DCCsj":{"type":"rel","origins":[{"source":"Examples/nat.k","name":"succ","compiledAt":"2026-05-29T01:54:22.928Z","start":{"line":4,"column":8},"end":{"line":4,"column":14}}]},"@mKEAm5rV7BDCh244NfCQgYE8wbEqbQMN3dbbPqBPg393":{"type":"rel","origins":[{"source":"Examples/nat.k","name":"add","compiledAt":"2026-05-29T01:54:22.928Z","start":{"line":5,"column":10},"end":{"line":8,"column":2}}]},"@2BBEqu8VuB2NPE89pNNCe9hPbmesi5JFSUQmGgnSRchp":{"type":"rel","origins":[{"source":"Examples/nat.k","name":"mult","compiledAt":"2026-05-29T01:54:22.928Z","start":{"line":9,"column":8},"end":{"line":12,"column":2}}]}},"main":null}
|
package/nak2.klib
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"format":"k-object","codes":{"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c":{"code":"product","product":{},"def":"$C0={};"},"@w8iSHeQQE738vEmWNGja3FQWk3XuExQKZ2pbm8ApEdkF":{"code":"union","union":{"succ":"@w8iSHeQQE738vEmWNGja3FQWk3XuExQKZ2pbm8ApEdkF","zero":"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c"},"def":"$C0=<C0\"succ\",C1\"zero\">;$C1={};"}},"rels":{"@p5vX3t22gqMxGDRMngp7bGmHwhxZT5hXHFVb862a2kvM":{"def":{"op":"comp","comp":[{"op":"product","product":[],"patterns":[1,0]},{"op":"vid","vid":"zero","patterns":[0,2]}],"patterns":[1,2]},"typeDerivation":{"status":"converged"},"typePatternGraph":{"patterns":{"nodes":[{"pattern":"type","type":"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c"},{"pattern":"(...)","fields":[],"rule":"comp:chain"},{"pattern":"<...>","fields":["zero"],"rule":"comp:chain"}],"parent":[]},"edges":[{},{},{"zero":[0]}],"codeId":{"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c":0}}},"@nXXqMAi2PVsBzSN2KidWgg74hYhBbHQt5hw5TgPKvEy5":{"def":{"op":"comp","comp":[{"op":"product","product":[{"label":"if","exp":{"op":"div","div":"zero","patterns":[1,2]}},{"label":"then","exp":{"op":"identity","patterns":[1,1]}}],"patterns":[1,0]},{"op":"dot","dot":"then","patterns":[0,1]}],"patterns":[1,1]},"typeDerivation":{"status":"converged"},"typePatternGraph":{"patterns":{"nodes":[{"pattern":"{}","fields":["if","then"],"rule":"comp:chain"},{"pattern":"<...>","fields":["zero"],"rule":"comp:chain"},{"pattern":"(...)","fields":[],"rule":"comp:chain."}],"parent":[]},"edges":[{"if":[2],"then":[1]},{"zero":[2]},{}],"codeId":{}}},"@SwjzXdcxv8ZbpCkF4cXGtgKkqPTfYqGGP5erQE7DCCsj":{"def":{"op":"vid","vid":"succ","patterns":[1,0]},"typeDerivation":{"status":"converged"},"typePatternGraph":{"patterns":{"nodes":[{"pattern":"<...>","fields":["succ"],"rule":"comp:chain"},{"pattern":"(...)","fields":[],"rule":"comp:chain."}],"parent":[]},"edges":[{"succ":[1]},{}],"codeId":{}}},"@TJpAUPHR8Nch4PrWdXvg6D7qTtJ37vDvYdSkTvg6qX65":{"def":{"op":"union","union":[{"op":"comp","comp":[{"op":"product","product":[{"label":"x","exp":{"op":"comp","comp":[{"op":"dot","dot":"x","patterns":[0,1]},{"op":"div","div":"succ","patterns":[1,1]}],"patterns":[0,1]}},{"label":"y","exp":{"op":"comp","comp":[{"op":"dot","dot":"y","patterns":[0,1]},{"op":"ref","ref":"@SwjzXdcxv8ZbpCkF4cXGtgKkqPTfYqGGP5erQE7DCCsj","patterns":[1,1]}],"patterns":[0,1]}}],"patterns":[0,0]},{"op":"ref","ref":"@TJpAUPHR8Nch4PrWdXvg6D7qTtJ37vDvYdSkTvg6qX65","patterns":[0,1]}],"patterns":[0,1]},{"op":"dot","dot":"y","patterns":[0,1]}],"patterns":[0,1]},"typeDerivation":{"status":"converged"},"typePatternGraph":{"patterns":{"nodes":[{"pattern":"{}","fields":["x","y"],"rule":"comp:chain"},{"pattern":"<...>","fields":["succ"],"rule":"ref:input mKEA(mKEA)."}],"parent":[]},"edges":[{"x":[1],"y":[1]},{"succ":[1]}],"codeId":{}}},"@ELHmpgN5z5NNrDHPffcKRspqmivABSpjM4fbd25TyWw8":{"def":{"op":"union","union":[{"op":"comp","comp":[{"op":"union","union":[{"op":"comp","comp":[{"op":"dot","dot":"x","patterns":[2,3]},{"op":"ref","ref":"@nXXqMAi2PVsBzSN2KidWgg74hYhBbHQt5hw5TgPKvEy5","patterns":[3,3]}],"patterns":[2,3]},{"op":"comp","comp":[{"op":"dot","dot":"y","patterns":[2,3]},{"op":"ref","ref":"@nXXqMAi2PVsBzSN2KidWgg74hYhBbHQt5hw5TgPKvEy5","patterns":[3,3]}],"patterns":[2,3]}],"patterns":[2,3]},{"op":"ref","ref":"@p5vX3t22gqMxGDRMngp7bGmHwhxZT5hXHFVb862a2kvM","patterns":[3,3]}],"patterns":[2,3]},{"op":"comp","comp":[{"op":"product","product":[{"label":"x","exp":{"op":"comp","comp":[{"op":"product","product":[{"label":"x","exp":{"op":"comp","comp":[{"op":"dot","dot":"x","patterns":[2,3]},{"op":"div","div":"succ","patterns":[3,3]}],"patterns":[2,3]}},{"label":"y","exp":{"op":"dot","dot":"y","patterns":[2,3]}}],"patterns":[2,0]},{"op":"ref","ref":"@ELHmpgN5z5NNrDHPffcKRspqmivABSpjM4fbd25TyWw8","patterns":[0,3]}],"patterns":[2,3]}},{"label":"y","exp":{"op":"dot","dot":"y","patterns":[2,3]}}],"patterns":[2,0]},{"op":"ref","ref":"@TJpAUPHR8Nch4PrWdXvg6D7qTtJ37vDvYdSkTvg6qX65","patterns":[0,3]}],"patterns":[2,3]}],"patterns":[2,3]},"typeDerivation":{"status":"converged"},"typePatternGraph":{"patterns":{"nodes":[{"pattern":"{}","fields":["x","y"],"rule":"ref:input 2BBE(2BBE)"},{"pattern":"type","type":"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c"},{"pattern":"{...}","fields":["x","y"],"rule":"comp:chain"},{"pattern":"<...>","fields":["succ","zero"],"rule":"ref:input 2BBE(mKEA)."}],"parent":[]},"edges":[{"x":[3],"y":[3]},{},{"x":[3],"y":[3]},{"succ":[3],"zero":[1]}],"codeId":{"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c":1}}}},"relAlias":{"nXXq":"@nXXqMAi2PVsBzSN2KidWgg74hYhBbHQt5hw5TgPKvEy5","p5vX":"@p5vX3t22gqMxGDRMngp7bGmHwhxZT5hXHFVb862a2kvM","Swjz":"@SwjzXdcxv8ZbpCkF4cXGtgKkqPTfYqGGP5erQE7DCCsj","mKEA":"@TJpAUPHR8Nch4PrWdXvg6D7qTtJ37vDvYdSkTvg6qX65","2BBE":"@ELHmpgN5z5NNrDHPffcKRspqmivABSpjM4fbd25TyWw8","__main__":"@QfyLpmn56wuppuGvrrUJz8LKtgaXfbMtad7RnzBcFk2S"},"compileStats":{"sccs":[{"members":["nXXq"],"strategy":"single_pass","iterations":1,"converged":true},{"members":["p5vX"],"strategy":"single_pass","iterations":1,"converged":true},{"members":["Swjz"],"strategy":"single_pass","iterations":1,"converged":true},{"members":["mKEA"],"strategy":"fixed_point","iterations":1,"converged":true},{"members":["2BBE"],"strategy":"fixed_point","iterations":1,"converged":true},{"members":["__main__"],"strategy":"single_pass","iterations":1,"converged":true}],"sccCount":6},"meta":{"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c":{"type":"code","origins":[{"source":"nat.k","name":"NiDZ","compiledAt":"2026-05-29T01:55:17.693Z","start":{"line":2,"column":10},"end":{"line":2,"column":12}}]},"@w8iSHeQQE738vEmWNGja3FQWk3XuExQKZ2pbm8ApEdkF":{"type":"code","origins":[{"source":"nat.k","name":"w8iS","compiledAt":"2026-05-29T01:55:17.693Z","start":{"line":3,"column":10},"end":{"line":3,"column":38}}]},"@nXXqMAi2PVsBzSN2KidWgg74hYhBbHQt5hw5TgPKvEy5":{"type":"rel","origins":[{"source":"nat.k","name":"nXXq","compiledAt":"2026-05-29T01:55:17.693Z","start":{"line":6,"column":8},"end":{"line":6,"column":71}}]},"@p5vX3t22gqMxGDRMngp7bGmHwhxZT5hXHFVb862a2kvM":{"type":"rel","origins":[{"source":"nat.k","name":"p5vX","compiledAt":"2026-05-29T01:55:17.693Z","start":{"line":5,"column":8},"end":{"line":5,"column":42}}]},"@SwjzXdcxv8ZbpCkF4cXGtgKkqPTfYqGGP5erQE7DCCsj":{"type":"rel","origins":[{"source":"nat.k","name":"Swjz","compiledAt":"2026-05-29T01:55:17.693Z","start":{"line":7,"column":15},"end":{"line":7,"column":20}}]},"@TJpAUPHR8Nch4PrWdXvg6D7qTtJ37vDvYdSkTvg6qX65":{"type":"rel","origins":[{"source":"nat.k","name":"mKEA","compiledAt":"2026-05-29T01:55:17.693Z","start":{"line":8,"column":52},"end":{"line":8,"column":86}}]},"@ELHmpgN5z5NNrDHPffcKRspqmivABSpjM4fbd25TyWw8":{"type":"rel","origins":[{"source":"nat.k","name":"2BBE","compiledAt":"2026-05-29T01:55:17.693Z","start":{"line":9,"column":54},"end":{"line":9,"column":119}}]}},"main":null}
|
package/nat.k
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
----- codes -----
|
|
2
|
+
$ NiDZ = {};
|
|
3
|
+
$ w8iS = < w8iS "succ", NiDZ "zero" >;
|
|
4
|
+
----- rels -----
|
|
5
|
+
p5vX = ?(...) {} |zero ?<$NiDZ zero, ...>;
|
|
6
|
+
nXXq = ?<(...) zero, ...> {/zero if, () then} .then ?<(...) zero, ...>;
|
|
7
|
+
Swjz = ?(...) |succ ?<(...) succ, ...>;
|
|
8
|
+
mKEA = ?{<X0 succ, ...>=X0 x, <X1 succ, ...>=X1 y} <{.x /succ x, .y Swjz y} mKEA, .y> ?<X0 succ, ...>=X0;
|
|
9
|
+
2BBE = ?{<X0 succ, $NiDZ zero, ...>=X0 x, X0 y, ...} <<.x nXXq, .y nXXq> p5vX, {{.x /succ x, .y y} 2BBE x, .y y} mKEA> ?<X0 succ, $NiDZ zero, ...>=X0;
|
|
10
|
+
()
|
package/nat2.k
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
----- codes -----
|
|
2
|
+
$ NiDZ = {};
|
|
3
|
+
$ w8iS = < w8iS "succ", NiDZ "zero" >;
|
|
4
|
+
----- rels -----
|
|
5
|
+
p5vX = ?(...) {} |zero ?<$NiDZ zero, ...>;
|
|
6
|
+
nXXq = ?<(...) zero, ...> {/zero if, () then} .then ?<(...) zero, ...>;
|
|
7
|
+
Swjz = ?(...) |succ ?<(...) succ, ...>;
|
|
8
|
+
TJpA = ?{<X0 succ, ...>=X0 x, X0 y} <{.x /succ x, .y Swjz y} TJpA, .y> ?<X0 succ, ...>=X0;
|
|
9
|
+
ELHm = ?{<X0 succ, $NiDZ zero, ...>=X0 x, X0 y, ...} <<.x nXXq, .y nXXq> p5vX, {{.x /succ x, .y y} ELHm x, .y y} TJpA> ?<X0 succ, $NiDZ zero, ...>=X0;
|
package/object.mjs
CHANGED
|
@@ -702,21 +702,29 @@ function codeToSource(code, aliases) {
|
|
|
702
702
|
return code.code === "product" ? `{${body}}` : `< ${body} >`;
|
|
703
703
|
}
|
|
704
704
|
|
|
705
|
-
function
|
|
706
|
-
|
|
707
|
-
|
|
705
|
+
function boundaryFilterSources(typePatternGraph, patternIds, aliases) {
|
|
706
|
+
return patterns2filters(typePatternGraph, ...patternIds)
|
|
707
|
+
.map((filter) => prettyRel({
|
|
708
|
+
op: "filter",
|
|
709
|
+
filter: rewriteCodesInFilter(filter, aliases)
|
|
710
|
+
}));
|
|
708
711
|
}
|
|
709
712
|
|
|
710
713
|
function prettyRelation(rel, aliases = {}, relAliases = {}) {
|
|
714
|
+
const [inputFilter, outputFilter] = boundaryFilterSources(
|
|
715
|
+
rel.typePatternGraph,
|
|
716
|
+
[rel.def.patterns[0], rel.def.patterns[1]],
|
|
717
|
+
aliases
|
|
718
|
+
);
|
|
711
719
|
const body = rewriteRefsInExp(
|
|
712
720
|
stripRelationBoundaryFilters(stripDebugFieldsFromExp(rel.def), rel.typePatternGraph),
|
|
713
721
|
aliases,
|
|
714
722
|
relAliases
|
|
715
723
|
);
|
|
716
724
|
return [
|
|
717
|
-
|
|
725
|
+
inputFilter,
|
|
718
726
|
prettyRel(body),
|
|
719
|
-
|
|
727
|
+
outputFilter
|
|
720
728
|
].join(" ");
|
|
721
729
|
}
|
|
722
730
|
|
|
@@ -768,10 +776,15 @@ function decompileObject(object) {
|
|
|
768
776
|
|
|
769
777
|
const mainRel = relAliases[hydrated.main] || hydrated.main;
|
|
770
778
|
const mainRelDef = rels[hydrated.main];
|
|
779
|
+
const [mainInputFilter, mainOutputFilter] = boundaryFilterSources(
|
|
780
|
+
mainRelDef.typePatternGraph,
|
|
781
|
+
[mainRelDef.def.patterns[0], mainRelDef.def.patterns[1]],
|
|
782
|
+
aliases
|
|
783
|
+
);
|
|
771
784
|
const main = [
|
|
772
|
-
|
|
785
|
+
mainInputFilter,
|
|
773
786
|
aliases[mainRel] || mainRel,
|
|
774
|
-
|
|
787
|
+
mainOutputFilter
|
|
775
788
|
].join(" ");
|
|
776
789
|
|
|
777
790
|
return [
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fraczak/k",
|
|
3
|
-
"version": "6.1.
|
|
3
|
+
"version": "6.1.3",
|
|
4
4
|
"description": "k — a language for composing first-order partial functions over algebraic data types (products and tagged unions); includes runtime, type derivation, REPL, and codec toolchain",
|
|
5
5
|
"main": "index.mjs",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"prepare": "jiwson -m es6 parser.jison -o parser.mjs; jiwson -m es6 valueParser.jison -o valueParser.mjs; ",
|
|
8
8
|
"test": "node test.mjs; for f in Code-derivation-tests/*.mjs; do echo $f; node $f; done; node test-fingerprint.mjs; node test-hash-fuzz.mjs; node test-hash-normalization.mjs; node test-k-object.mjs; node test-repl.mjs; node test-ieee-arithmetic.mjs; ./tests.sh",
|
|
9
|
+
"perf:idempotency": "node scripts/benchmark-idempotency.mjs",
|
|
9
10
|
"deps:graph": "node scripts/generate-dependency-graph.mjs"
|
|
10
11
|
},
|
|
11
12
|
"repository": {
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { spawnSync } from "node:child_process";
|
|
4
|
+
import { mkdtempSync, statSync } from "node:fs";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { performance } from "node:perf_hooks";
|
|
8
|
+
|
|
9
|
+
const DEFAULT_EXAMPLES = [
|
|
10
|
+
"Examples/nat.k",
|
|
11
|
+
"Examples/byte.k",
|
|
12
|
+
"Examples/bnat.k",
|
|
13
|
+
"Examples/arithmetics.k",
|
|
14
|
+
"Examples/ieee.k"
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
const iterations = Number(process.env.K_BENCH_ITERATIONS || 5);
|
|
18
|
+
const examples = process.argv.slice(2);
|
|
19
|
+
const benchmarkExamples = examples.length > 0 ? examples : DEFAULT_EXAMPLES;
|
|
20
|
+
|
|
21
|
+
function run(args) {
|
|
22
|
+
const result = spawnSync("node", args, {
|
|
23
|
+
cwd: process.cwd(),
|
|
24
|
+
encoding: "utf8",
|
|
25
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
26
|
+
});
|
|
27
|
+
if (result.status !== 0) {
|
|
28
|
+
throw new Error(`${args.join(" ")} failed\n${result.stderr || result.stdout}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function median(values) {
|
|
33
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
34
|
+
return sorted[Math.floor(sorted.length / 2)];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function formatMs(value) {
|
|
38
|
+
return `${Math.round(value)} ms`;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function formatBytes(value) {
|
|
42
|
+
if (value >= 1024 * 1024) return `${(value / (1024 * 1024)).toFixed(1)} MiB`;
|
|
43
|
+
if (value >= 1024) return `${Math.round(value / 1024)} KiB`;
|
|
44
|
+
return `${value} B`;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
console.log(`compile-lib/decompile round-trip benchmark (${iterations} iterations)`);
|
|
48
|
+
console.log("example, median, min, max, object");
|
|
49
|
+
|
|
50
|
+
for (const example of benchmarkExamples) {
|
|
51
|
+
const times = [];
|
|
52
|
+
let size = 0;
|
|
53
|
+
|
|
54
|
+
for (let i = 0; i < iterations; i++) {
|
|
55
|
+
const out = mkdtempSync(join(tmpdir(), `k-idempotency-bench-${example.replaceAll("/", "_")}-`));
|
|
56
|
+
const t0 = performance.now();
|
|
57
|
+
run(["objects/compile-lib.mjs", example, join(out, "1.klib")]);
|
|
58
|
+
run(["objects/decompile.mjs", join(out, "1.klib"), join(out, "1.k")]);
|
|
59
|
+
run(["objects/compile-lib.mjs", join(out, "1.k"), join(out, "2.klib")]);
|
|
60
|
+
run(["objects/decompile.mjs", join(out, "2.klib"), join(out, "2.k")]);
|
|
61
|
+
times.push(performance.now() - t0);
|
|
62
|
+
size = statSync(join(out, "1.klib")).size;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
console.log([
|
|
66
|
+
example,
|
|
67
|
+
formatMs(median(times)),
|
|
68
|
+
formatMs(Math.min(...times)),
|
|
69
|
+
formatMs(Math.max(...times)),
|
|
70
|
+
formatBytes(size)
|
|
71
|
+
].join(", "));
|
|
72
|
+
}
|
package/test-k-object.mjs
CHANGED
|
@@ -91,6 +91,25 @@ assert.match(decompiledSource, /\$ Nws3 =/);
|
|
|
91
91
|
assert.match(decompiledSource, /^7jfi = /m);
|
|
92
92
|
assert.match(decompiledSource, /^----- main -----\n\?\(\.\.\.\) 7jfi \$Nws3$/m);
|
|
93
93
|
|
|
94
|
+
const natLibraryBuffer = compileLibraryBuffer(fs.readFileSync("Examples/nat.k", "utf8"), { source: "Examples/nat.k" });
|
|
95
|
+
const natDecompiledSource = decompileObjectBuffer(natLibraryBuffer);
|
|
96
|
+
const natRoundTripSource = decompileObjectBuffer(
|
|
97
|
+
compileLibraryBuffer(natDecompiledSource, { source: "Examples/nat.decompiled.k" })
|
|
98
|
+
);
|
|
99
|
+
const recursiveNatPattern = /\?\{<X0 succ, \.\.\.>=X0 x, <X1 succ, \.\.\.>=X1 y\} .* \?X1;/;
|
|
100
|
+
assert.equal(natRoundTripSource, natDecompiledSource);
|
|
101
|
+
assert.match(natDecompiledSource, recursiveNatPattern);
|
|
102
|
+
|
|
103
|
+
const arithmeticsLibraryBuffer = compileLibraryBuffer(
|
|
104
|
+
fs.readFileSync("Examples/arithmetics.k", "utf8"),
|
|
105
|
+
{ source: "Examples/arithmetics.k" }
|
|
106
|
+
);
|
|
107
|
+
const arithmeticsDecompiledSource = decompileObjectBuffer(arithmeticsLibraryBuffer);
|
|
108
|
+
const arithmeticsRoundTripSource = decompileObjectBuffer(
|
|
109
|
+
compileLibraryBuffer(arithmeticsDecompiledSource, { source: "Examples/arithmetics.decompiled.k" })
|
|
110
|
+
);
|
|
111
|
+
assert.equal(arithmeticsRoundTripSource, arithmeticsDecompiledSource);
|
|
112
|
+
|
|
94
113
|
assert.throws(() => k.compile("@A = (); @A"), /Parse error/);
|
|
95
114
|
assert.throws(() => k.compile("$ @A = {}; $@A"), /Parse error/);
|
|
96
115
|
assert.deepEqual(k.compile("7jfi = ?X0; 7jfi")(new Product({})).toJSON(), {});
|