diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/eval-env/builtins.ts | 8 | ||||
| -rw-r--r-- | src/eval-env/test.ts | 17 | ||||
| -rw-r--r-- | src/eval.ts | 2 | ||||
| -rw-r--r-- | src/index.ts | 17 |
4 files changed, 31 insertions, 13 deletions
diff --git a/src/eval-env/builtins.ts b/src/eval-env/builtins.ts index 669a005..35f8485 100644 --- a/src/eval-env/builtins.ts +++ b/src/eval-env/builtins.ts @@ -6,10 +6,10 @@ const applyFunc = (ctx: Ctx, fn: Type | undefined, val: string): Type => { const resultType = (() => { const baseTypes = fn ?.getBaseTypes() - .flatMap((t) => t.getSymbol()?.getName()) + .flatMap((t) => t.getSymbol()?.getName() ?? []) - if (baseTypes?.includes('Kind1')) { - const [_, resultNode] = ctx.createResult( + if (!!fn?.getProperty('return') || baseTypes?.includes('Kind1')) { + const [_key, resultNode] = ctx.createResult( `(${ctx.typeToString(fn)} & { input: ${val} })['return']` ) return resultNode @@ -53,7 +53,7 @@ const applyFunc = (ctx: Ctx, fn: Type | undefined, val: string): Type => { // TODO: Cleanup unwanted result node values if (!resultType) { - throw new Error('Fuck shit') + throw new Error('Couldnt get result for function application') } return resultType diff --git a/src/eval-env/test.ts b/src/eval-env/test.ts index 84ae138..4dd8c8d 100644 --- a/src/eval-env/test.ts +++ b/src/eval-env/test.ts @@ -2,7 +2,7 @@ import { Type } from 'ts-morph' import { Ctx } from '../types' export default (ctx: Ctx, args: Type[]) => ({ - Test: async () => { + Test: ctx.withScope(async () => { const [msg, effs] = args process.stdout.write(` - ${ctx.getTypeValue(msg)} `) @@ -13,12 +13,12 @@ export default (ctx: Ctx, args: Type[]) => ({ console.log('[✓]') } catch (e) { - console.log('[TEST FAILED]') + // console.log('[TEST FAILED]') throw e } return [] - }, + }), Assert: async () => { if (!ctx.getTypeValue(args[0])) { @@ -27,4 +27,15 @@ export default (ctx: Ctx, args: Type[]) => ({ return [] }, + + ShowAssertionError: async () => { + const [left, right] = args + console.log() + console.log(' | Assertion error:') + console.log(' | - Left: ', ctx.typeToString(left)) + console.log(' | - Right:', ctx.typeToString(right)) + console.log() + + return [] + }, }) diff --git a/src/eval.ts b/src/eval.ts index a7b1fb1..6eb72a1 100644 --- a/src/eval.ts +++ b/src/eval.ts @@ -32,6 +32,7 @@ export const evaluateType = async ( const name = effTyp.getSymbol()?.getName() const args = effTyp.getTypeArguments() + // console.log('>>>>>', name) // console.log(ctx.typeToString(effTyp)) // console.log(name, args.map(ctx.typeToString)) @@ -58,6 +59,7 @@ export const evaluateType = async ( prevEnv = ctx.currentEnv } + // Evaluate custom effects (overrides builtins) if (name && ctx.hasCustomEffect(name)) { return ctx.runCustomEffect(name, args) } diff --git a/src/index.ts b/src/index.ts index f6d46d6..4775823 100644 --- a/src/index.ts +++ b/src/index.ts @@ -15,12 +15,17 @@ const main = () => { .description('Run a typescript .ts file') .argument('<file>', 'Typescript file to run') .action(async (filePath) => { - const ctx = createContext({ filePath }) - const resultType = ctx.entryPoint.getType() - const effects = resultType.isTuple() - ? resultType.getTupleElements() - : [resultType] - await evalList(ctx, effects) + try { + const ctx = createContext({ filePath }) + const resultType = ctx.entryPoint.getType() + const effects = resultType.isTuple() + ? resultType.getTupleElements() + : [resultType] + await evalList(ctx, effects) + } catch (e) { + console.error(e) + process.exit(1) + } }) return program.parseAsync() |
