summaryrefslogtreecommitdiff
path: root/lambda-calcul
diff options
context:
space:
mode:
Diffstat (limited to 'lambda-calcul')
-rw-r--r--lambda-calcul/javascript/index.js6
-rw-r--r--lambda-calcul/javascript/src/client.js19
-rw-r--r--lambda-calcul/javascript/src/internals.js5
-rw-r--r--lambda-calcul/javascript/src/interpreter.js7
-rw-r--r--lambda-calcul/javascript/src/parser.js7
-rw-r--r--lambda-calcul/javascript/src/printer.js5
-rw-r--r--lambda-calcul/javascript/test/client.test.js26
-rw-r--r--lambda-calcul/javascript/test/interpreter.test.js9
-rw-r--r--lambda-calcul/javascript/test/parser.test.js9
-rw-r--r--lambda-calcul/javascript/test/printer.test.js9
10 files changed, 99 insertions, 3 deletions
diff --git a/lambda-calcul/javascript/index.js b/lambda-calcul/javascript/index.js
index e06ac4d..a71697d 100644
--- a/lambda-calcul/javascript/index.js
+++ b/lambda-calcul/javascript/index.js
@@ -8,6 +8,8 @@ client = LC.newClient({
});
client.start()
- .then((token) => console.log(`${playerName} has registered with token ${token}`) || token)
+ .then(token => console.log(`${playerName} has registered with token ${token}`) || token)
.then(client.nextChallenge)
- .then((challenge) => console.log(`Next challenge: ${challenge}`));
+ .then(challenge => console.log(`Next challenge: ${challenge}`) || challenge)
+ .then(client.solve)
+ .then(solution => console.log(`… solved into: ${solution}`));
diff --git a/lambda-calcul/javascript/src/client.js b/lambda-calcul/javascript/src/client.js
index d046187..88ea253 100644
--- a/lambda-calcul/javascript/src/client.js
+++ b/lambda-calcul/javascript/src/client.js
@@ -1,11 +1,27 @@
const axios = require('axios');
-const newClient = ({ playerName, challengerURL }) => {
+const defaultInterpreter = require('./interpreter');
+const defaultParser = require('./parser');
+const defaultPrinter = require('./printer');
+
+const newClient = ({
+ challengerURL,
+ interpreter = defaultInterpreter,
+ parser = defaultParser,
+ playerName,
+ printer = defaultPrinter,
+}) => {
const nextChallenge = (token) => axios ({
url: `${challengerURL}/api/challenge?token=${token}`,
})
.then(({ data: { expr } }) => expr);
+ const solve = (challenge) => {
+ const parsedExpression = parser.parse(challenge);
+ const evaluatedExpression = interpreter.evaluate(parsedExpression);
+ return printer.print(evaluatedExpression);
+ }
+
const start = () => axios({
method: 'POST',
url: `${challengerURL}/api/register`,
@@ -16,6 +32,7 @@ const newClient = ({ playerName, challengerURL }) => {
return {
nextChallenge,
+ solve,
start,
};
};
diff --git a/lambda-calcul/javascript/src/internals.js b/lambda-calcul/javascript/src/internals.js
new file mode 100644
index 0000000..f55736a
--- /dev/null
+++ b/lambda-calcul/javascript/src/internals.js
@@ -0,0 +1,5 @@
+const σ = (name) => ({ sym: name });
+
+module.exports = {
+ σ,
+};
diff --git a/lambda-calcul/javascript/src/interpreter.js b/lambda-calcul/javascript/src/interpreter.js
new file mode 100644
index 0000000..a2e8481
--- /dev/null
+++ b/lambda-calcul/javascript/src/interpreter.js
@@ -0,0 +1,7 @@
+const { σ } = require('./internals');
+
+const evaluate = (term) => term;
+
+module.exports = {
+ evaluate,
+};
diff --git a/lambda-calcul/javascript/src/parser.js b/lambda-calcul/javascript/src/parser.js
new file mode 100644
index 0000000..77593e0
--- /dev/null
+++ b/lambda-calcul/javascript/src/parser.js
@@ -0,0 +1,7 @@
+const { σ } = require('./internals');
+
+const parse = (x) => σ(x);
+
+module.exports = {
+ parse,
+};
diff --git a/lambda-calcul/javascript/src/printer.js b/lambda-calcul/javascript/src/printer.js
new file mode 100644
index 0000000..39dbf38
--- /dev/null
+++ b/lambda-calcul/javascript/src/printer.js
@@ -0,0 +1,5 @@
+const print = ({ sym: name }) => name;
+
+module.exports = {
+ print,
+};
diff --git a/lambda-calcul/javascript/test/client.test.js b/lambda-calcul/javascript/test/client.test.js
index 5fcc42c..8b68a61 100644
--- a/lambda-calcul/javascript/test/client.test.js
+++ b/lambda-calcul/javascript/test/client.test.js
@@ -54,4 +54,30 @@ describe('λ-calculator', () => {
return client.nextChallenge('SomeToken')
.then((challenge) => expect(challenge).toBe('SomeChallenge'));
});
+
+ it('solves challenges', () => {
+ const parser = {
+ parse: (challenge) => {
+ expect(challenge).toBe('Some challenge');
+ return 'Parsed expression';
+ },
+ };
+
+ const interpreter = {
+ evaluate: (parsedExpression) => {
+ expect(parsedExpression).toBe('Parsed expression');
+ return 'Evaluated expression';
+ },
+ };
+
+ const printer = {
+ print: (evaluatedExpression) => {
+ expect(evaluatedExpression).toBe('Evaluated expression');
+ return 'Expression to print';
+ },
+ };
+
+ const client = LC.newClient({ parser, interpreter, printer });
+ expect(client.solve('Some challenge')).toBe('Expression to print');
+ });
});
diff --git a/lambda-calcul/javascript/test/interpreter.test.js b/lambda-calcul/javascript/test/interpreter.test.js
new file mode 100644
index 0000000..a859bfe
--- /dev/null
+++ b/lambda-calcul/javascript/test/interpreter.test.js
@@ -0,0 +1,9 @@
+const { σ } = require('../src/internals');
+const { evaluate } = require('../src/interpreter');
+
+describe('An interpreter', () => {
+ it('evaluates symbols', () => {
+ expect(evaluate(σ('x'))).toEqual(σ('x'));
+ expect(evaluate(σ('y'))).toEqual(σ('y'));
+ });
+});
diff --git a/lambda-calcul/javascript/test/parser.test.js b/lambda-calcul/javascript/test/parser.test.js
new file mode 100644
index 0000000..e9cab60
--- /dev/null
+++ b/lambda-calcul/javascript/test/parser.test.js
@@ -0,0 +1,9 @@
+const { σ } = require('../src/internals');
+const { parse } = require('../src/parser');
+
+describe('A parser', () => {
+ it('parses symbols', () => {
+ expect(parse('x')).toEqual(σ('x'));
+ expect(parse('y')).toEqual(σ('y'));
+ });
+});
diff --git a/lambda-calcul/javascript/test/printer.test.js b/lambda-calcul/javascript/test/printer.test.js
new file mode 100644
index 0000000..1684d31
--- /dev/null
+++ b/lambda-calcul/javascript/test/printer.test.js
@@ -0,0 +1,9 @@
+const { σ } = require('../src/internals');
+const { print } = require('../src/printer');
+
+describe('A printer', () => {
+ it('prints symbols', () => {
+ expect(print(σ('x'))).toEqual('x');
+ expect(print(σ('y'))).toEqual('y');
+ });
+});