Skip to content

Commit df787b2

Browse files
committed
Move some expression stuff out of the compiler
1 parent dd9cc36 commit df787b2

File tree

16 files changed

+381
-331
lines changed

16 files changed

+381
-331
lines changed

src/language/compiling/semantics/expressions/runtime-expression.ts

Lines changed: 0 additions & 91 deletions
This file was deleted.

src/language/compiling/semantics/expressions/apply-expression.ts renamed to src/language/compiling/semantics/keyword-handlers/apply-handler.ts

Lines changed: 2 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import { either, type Either } from '../../../../adts.js'
22
import type { ElaborationError } from '../../../errors.js'
3-
import type { Molecule } from '../../../parsing.js'
43
import {
5-
isExpression,
4+
asSemanticGraph,
65
isFunctionNode,
7-
makeUnelaboratedObjectNode,
6+
readApplyExpression,
87
type Expression,
98
} from '../../../semantics.js'
109
import {
@@ -14,49 +13,7 @@ import {
1413
import {
1514
containsAnyUnelaboratedNodes,
1615
type SemanticGraph,
17-
type unelaboratedKey,
1816
} from '../../../semantics/semantic-graph.js'
19-
import {
20-
asSemanticGraph,
21-
readArgumentsFromExpression,
22-
} from './expression-utilities.js'
23-
24-
export const applyKeyword = '@apply'
25-
26-
export type ApplyExpression = Expression & {
27-
readonly 0: '@apply'
28-
readonly function: SemanticGraph | Molecule
29-
readonly argument: SemanticGraph | Molecule
30-
}
31-
32-
export const readApplyExpression = (
33-
node: SemanticGraph,
34-
): Either<ElaborationError, ApplyExpression> =>
35-
isExpression(node)
36-
? either.map(
37-
readArgumentsFromExpression(node, [
38-
['function', '1'],
39-
['argument', '2'],
40-
]),
41-
([f, argument]) => makeApplyExpression({ function: f, argument }),
42-
)
43-
: either.makeLeft({
44-
kind: 'invalidExpression',
45-
message: 'not an expression',
46-
})
47-
48-
export const makeApplyExpression = ({
49-
function: f,
50-
argument,
51-
}: {
52-
readonly function: SemanticGraph | Molecule
53-
readonly argument: SemanticGraph | Molecule
54-
}): ApplyExpression & { readonly [unelaboratedKey]: true } =>
55-
makeUnelaboratedObjectNode({
56-
0: '@apply',
57-
function: f,
58-
argument,
59-
})
6017

6118
export const applyKeywordHandler: KeywordHandler = (
6219
expression: Expression,

src/language/compiling/semantics/expressions/check-expression.ts renamed to src/language/compiling/semantics/keyword-handlers/check-handler.ts

Lines changed: 2 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import { either, option, type Either } from '../../../../adts.js'
22
import type { ElaborationError } from '../../../errors.js'
3-
import type { Molecule } from '../../../parsing.js'
43
import {
5-
isExpression,
4+
asSemanticGraph,
65
isFunctionNode,
7-
makeUnelaboratedObjectNode,
6+
readCheckExpression,
87
type Expression,
98
} from '../../../semantics.js'
109
import {
@@ -15,49 +14,7 @@ import { lookupPropertyOfObjectNode } from '../../../semantics/object-node.js'
1514
import {
1615
stringifySemanticGraphForEndUser,
1716
type SemanticGraph,
18-
type unelaboratedKey,
1917
} from '../../../semantics/semantic-graph.js'
20-
import {
21-
asSemanticGraph,
22-
readArgumentsFromExpression,
23-
} from './expression-utilities.js'
24-
25-
export const checkKeyword = '@check'
26-
27-
export type CheckExpression = Expression & {
28-
readonly 0: '@check'
29-
readonly value: SemanticGraph | Molecule
30-
readonly type: SemanticGraph | Molecule
31-
}
32-
33-
export const readCheckExpression = (
34-
node: SemanticGraph,
35-
): Either<ElaborationError, CheckExpression> =>
36-
isExpression(node)
37-
? either.map(
38-
readArgumentsFromExpression(node, [
39-
['value', '1'],
40-
['type', '2'],
41-
]),
42-
([value, type]) => makeCheckExpression({ value, type }),
43-
)
44-
: either.makeLeft({
45-
kind: 'invalidExpression',
46-
message: 'not an expression',
47-
})
48-
49-
export const makeCheckExpression = ({
50-
value,
51-
type,
52-
}: {
53-
value: SemanticGraph | Molecule
54-
type: SemanticGraph | Molecule
55-
}): CheckExpression & { readonly [unelaboratedKey]: true } =>
56-
makeUnelaboratedObjectNode({
57-
0: '@check',
58-
value,
59-
type,
60-
})
6118

6219
export const checkKeywordHandler: KeywordHandler = (
6320
expression: Expression,

src/language/compiling/semantics/expressions/function-expression.ts renamed to src/language/compiling/semantics/keyword-handlers/function-handler.ts

Lines changed: 3 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import { either, option, type Either } from '../../../../adts.js'
22
import type { ElaborationError } from '../../../errors.js'
3-
import type { Atom, Molecule } from '../../../parsing.js'
43
import {
5-
isExpression,
4+
asSemanticGraph,
65
makeFunctionNode,
7-
makeUnelaboratedObjectNode,
6+
readFunctionExpression,
87
serialize,
98
types,
109
type Expression,
10+
type FunctionExpression,
1111
type FunctionNode,
1212
} from '../../../semantics.js'
1313
import {
@@ -19,55 +19,8 @@ import { makeObjectNode } from '../../../semantics/object-node.js'
1919
import {
2020
updateValueAtKeyPathInSemanticGraph,
2121
type SemanticGraph,
22-
type unelaboratedKey,
2322
} from '../../../semantics/semantic-graph.js'
2423
import { keywordHandlers } from '../keywords.js'
25-
import {
26-
asSemanticGraph,
27-
readArgumentsFromExpression,
28-
} from './expression-utilities.js'
29-
30-
export const functionKeyword = '@function'
31-
32-
export type FunctionExpression = Expression & {
33-
readonly 0: '@function'
34-
readonly parameter: Atom
35-
readonly body: SemanticGraph | Molecule
36-
}
37-
38-
export const readFunctionExpression = (
39-
node: SemanticGraph,
40-
): Either<ElaborationError, FunctionExpression> =>
41-
isExpression(node)
42-
? either.flatMap(
43-
readArgumentsFromExpression(node, [
44-
['parameter', '1'],
45-
['body', '2'],
46-
]),
47-
([parameter, body]): Either<ElaborationError, FunctionExpression> =>
48-
typeof parameter !== 'string'
49-
? either.makeLeft({
50-
kind: 'invalidExpression',
51-
message: 'parameter name must be an atom',
52-
})
53-
: either.map(serialize(asSemanticGraph(body)), body =>
54-
makeFunctionExpression(parameter, body),
55-
),
56-
)
57-
: either.makeLeft({
58-
kind: 'invalidExpression',
59-
message: 'not an expression',
60-
})
61-
62-
export const makeFunctionExpression = (
63-
parameter: Atom,
64-
body: SemanticGraph | Molecule,
65-
): FunctionExpression & { readonly [unelaboratedKey]: true } =>
66-
makeUnelaboratedObjectNode({
67-
0: '@function',
68-
parameter,
69-
body,
70-
})
7124

7225
export const functionKeywordHandler: KeywordHandler = (
7326
expression: Expression,

src/language/compiling/semantics/expressions/lookup-expression.ts renamed to src/language/compiling/semantics/keyword-handlers/lookup-handler.ts

Lines changed: 3 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ import type {
44
InvalidExpressionError,
55
} from '../../../errors.js'
66
import {
7-
isExpression,
8-
isFunctionNode,
7+
makeLookupExpression,
8+
readFunctionExpression,
9+
readLookupExpression,
910
type Expression,
1011
type KeyPath,
1112
} from '../../../semantics.js'
@@ -20,66 +21,13 @@ import {
2021
import {
2122
isObjectNode,
2223
makeObjectNode,
23-
makeUnelaboratedObjectNode,
2424
type ObjectNode,
2525
} from '../../../semantics/object-node.js'
2626
import {
2727
applyKeyPathToSemanticGraph,
2828
type SemanticGraph,
29-
type unelaboratedKey,
3029
} from '../../../semantics/semantic-graph.js'
3130
import { prelude } from '../prelude.js'
32-
import {
33-
asSemanticGraph,
34-
readArgumentsFromExpression,
35-
} from './expression-utilities.js'
36-
import { readFunctionExpression } from './function-expression.js'
37-
38-
export const lookupKeyword = '@lookup'
39-
40-
export type LookupExpression = Expression & {
41-
readonly 0: '@lookup'
42-
readonly query: ObjectNode
43-
}
44-
45-
export const readLookupExpression = (
46-
node: SemanticGraph,
47-
): Either<ElaborationError, LookupExpression> =>
48-
isExpression(node)
49-
? either.flatMap(
50-
readArgumentsFromExpression(node, [['query', '1']]),
51-
([q]) => {
52-
const query = asSemanticGraph(q)
53-
if (isFunctionNode(query)) {
54-
return either.makeLeft({
55-
kind: 'invalidExpression',
56-
message: 'query cannot be a function',
57-
})
58-
} else {
59-
const canonicalizedQuery =
60-
typeof query === 'string'
61-
? makeObjectNode(keyPathToMolecule(query.split('.')))
62-
: query
63-
64-
return either.map(
65-
keyPathFromObjectNode(canonicalizedQuery),
66-
_keyPath => makeLookupExpression(canonicalizedQuery),
67-
)
68-
}
69-
},
70-
)
71-
: either.makeLeft({
72-
kind: 'invalidExpression',
73-
message: 'not an expression',
74-
})
75-
76-
export const makeLookupExpression = (
77-
query: ObjectNode,
78-
): LookupExpression & { readonly [unelaboratedKey]: true } =>
79-
makeUnelaboratedObjectNode({
80-
0: '@lookup',
81-
query,
82-
})
8331

8432
export const lookupKeywordHandler: KeywordHandler = (
8533
expression: Expression,

0 commit comments

Comments
 (0)