Strict lambda parameters

This commit is contained in:
2024-08-22 23:36:51 +03:00
parent d7a91ad6fd
commit 084399c6b4
19 changed files with 156 additions and 169 deletions
+9 -9
View File
@@ -1,5 +1,5 @@
import { describe, expect, it } from '@jest/globals';
import { $, Term, _, g, l, n, undef } from '../src/core';
import { $, Term, _, _l, g, n, undef, _r as ref } from '../src/core';
import { toNOrd as $o, NOrd } from '../src/ord';
import { toBoolean as $b, iif } from '../src/bool';
import { toNumber as $n, Succ, Zero, fromNumber as _n, fromNumber as _nn, cmp as cmpn, eq as eqn, even, gt as ngt, odd, succ, sum } from '../src/num';
@@ -16,7 +16,7 @@ describe('List', () => {
const _na: (xs: number[]) => Term = xs => !xs.length ? Nil : Cons._(_n(xs[0]))._(_(() => _na(xs.slice(1))));
const $na: (xs: Term) => number[] = xs => $(xs._(_([]))._(l('x', l('xs', _(({ x, xs }) => _([$n(x), ...$na(xs)]))))));
const $na: (xs: Term) => number[] = xs => $(xs._(_([]))._(_l(x => _l(xs => _(({ x, xs }) => _([$n(x), ...$na(xs)]))))));
describe('toArray', () => {
it('converts []', () => {
@@ -60,7 +60,7 @@ describe('List', () => {
});
it('handles infinite lists', () => {
expect($n(cons._(_n(0))._(infinite)._(undef)._(l('x', l('_', 'x'))))).toBe(0);
expect($n(cons._(_n(0))._(infinite)._(undef)._(_l(x => _l(_ => x))))).toBe(0);
});
});
@@ -78,7 +78,7 @@ describe('List', () => {
});
it('handles infinite lists', () => {
expect($n(snoc._(infinite)._(_n(0))._(undef)._(l('x', l('_', 'x'))))).toBe(0);
expect($n(snoc._(infinite)._(_n(0))._(undef)._(_l(x => _l(_ => x))))).toBe(0);
});
});
@@ -142,7 +142,7 @@ describe('List', () => {
});
it('handles infinite lists', () => {
expect($n(append._(infinite)._(infinite)._(undef)._(l('x', l('_', 'x'))))).toBe(0);
expect($n(append._(infinite)._(infinite)._(undef)._(_l(x => _l(_ => x))))).toBe(0);
});
});
@@ -160,8 +160,8 @@ describe('List', () => {
});
it('handles infinite lists', () => {
const dinfinite: Term = g('dinfinite', cons._(infinite)._('dinfinite'));
expect($n(concat._(dinfinite)._(undef)._(l('x', l('_', 'x'))))).toBe(0);
const dinfinite: Term = g('dinfinite', cons._(infinite)._(ref('list.spec', 'dinfinite')));
expect($n(concat._(dinfinite)._(undef)._(_l(x => _l(_ => x))))).toBe(0);
});
});
@@ -263,7 +263,7 @@ describe('List', () => {
it('handles infinite lists', () => {
expect($n(
foldr
._(l('x', l('a', sum._('x')._(iif._(eqn._(_n(5))._('x'))._(Zero)._('a')))))
._(_l(x => _l(a => sum._(x)._(iif._(eqn._(_n(5))._(x))._(Zero)._(a)))))
._(Zero)
._(infinite)))
.toBe(15);
@@ -286,7 +286,7 @@ describe('List', () => {
it.failing('handles infinite lists', () => {
expect($n(
foldrz
._(l('x', l('a', sum._('x')._(iif._(eqn._(_n(5))._('x'))._(Zero)._('a')))))
._(_l(x => _l(a => sum._(x)._(iif._(eqn._(_n(5))._(x))._(Zero)._(a)))))
._(infinite)))
.toBe(15);
});
+2 -2
View File
@@ -1,5 +1,5 @@
import { describe, expect, it } from '@jest/globals';
import { Term, _, g, n, undef } from '../src/core';
import { Term, _, g, n, _r, undef } from '../src/core';
import { toNOrd as $o, NOrd } from '../src/ord';
import { toBoolean as $b, fromBoolean as _b } from '../src/bool';
import { toNumber as $n, Succ, Zero, fromNumber as _n, cmp, div, eq, ge, gt, ifz, le, lt, mod, mul, pred, sub, succ, sum } from '../src/num';
@@ -9,7 +9,7 @@ import { show } from '../src/num.show';
n('num.spec');
describe('Num', () => {
const infinity: Term = g('infinity', _(() => Succ._('num.spec', 'infinity')));
const infinity: Term = g('infinity', _(() => Succ._(_r('num.spec', 'infinity'))));
describe('toNumber', () => {
it('converts 0', () => {
+4 -4
View File
@@ -1,5 +1,5 @@
import { describe, expect, it } from '@jest/globals';
import { Term, _, g, l, n, undef } from '../src/core';
import { Term, _, _l, g, n, undef, _r as ref } from '../src/core';
import { NOrd, toNOrd } from '../src/ord';
import { toBoolean as $b } from '../src/bool';
import { toNumber as $n, Zero, gt as ngt } from '../src/num';
@@ -10,7 +10,7 @@ import { show } from '../src/string.show';
n('string.spec');
describe('String', () => {
const infinite: Term = g('infinite', Cons._(_c('a'))._('string.spec', 'infinite'));
const infinite: Term = g('infinite', Cons._(_c('a'))._(ref('string.spec', 'infinite')));
describe('toString', () => {
it('converts ""', () => {
@@ -108,7 +108,7 @@ describe('String', () => {
});
it('handles infinite strings', () => {
expect($c(append._(infinite)._(infinite)._(undef)._(l('x', l('_', 'x'))))).toBe('a');
expect($c(append._(infinite)._(infinite)._(undef)._(_l(x => _l(_ => x))))).toBe('a');
});
});
@@ -122,7 +122,7 @@ describe('String', () => {
});
it('handles infinite strings', () => {
expect($c(wrap._(infinite)._(infinite)._(undef)._(l('x', l('_', 'x'))))).toBe('a');
expect($c(wrap._(infinite)._(infinite)._(undef)._(_l(x => _l(_ => x))))).toBe('a');
});
});