diff options
| author | Kai Stevenson <kai@kaistevenson.com> | 2025-11-03 23:41:31 -0800 |
|---|---|---|
| committer | Kai Stevenson <kai@kaistevenson.com> | 2025-11-03 23:41:31 -0800 |
| commit | 8b610f2bcfc223333254ce9679730c42dce6d26e (patch) | |
| tree | ac1eab726395523f8725bda3d040e22214cba409 | |
| parent | 56040f3ff85e77311f0c864a89afd63fcf1bdb50 (diff) | |
add createFn
| -rw-r--r-- | src/index.ts | 3 | ||||
| -rw-r--r-- | src/lang/index.ts | 3 | ||||
| -rw-r--r-- | src/lang/js-lang/builtin/builtin.ts (renamed from src/js-lang/builtin/builtin.ts) | 0 | ||||
| -rw-r--r-- | src/lang/js-lang/builtin/index.ts (renamed from src/js-lang/builtin/index.ts) | 0 | ||||
| -rw-r--r-- | src/lang/js-lang/builtin/sbuiltin.ts (renamed from src/js-lang/builtin/sbuiltin.ts) | 0 | ||||
| -rw-r--r-- | src/lang/js-lang/core/eval.ts (renamed from src/js-lang/core/eval.ts) | 0 | ||||
| -rw-r--r-- | src/lang/js-lang/core/index.ts (renamed from src/js-lang/core/index.ts) | 0 | ||||
| -rw-r--r-- | src/lang/js-lang/core/lexer.ts (renamed from src/js-lang/core/lexer.ts) | 0 | ||||
| -rw-r--r-- | src/lang/js-lang/core/parser.ts (renamed from src/js-lang/core/parser.ts) | 0 | ||||
| -rw-r--r-- | src/lang/js-lang/index.ts (renamed from src/js-lang/index.ts) | 0 | ||||
| -rw-r--r-- | src/lang/ks-lang/index.ts | 27 | ||||
| -rw-r--r-- | src/lang/ts-lang/builtin/builtin.ts (renamed from src/ts-lang/builtin/builtin.ts) | 0 | ||||
| -rw-r--r-- | src/lang/ts-lang/builtin/index.ts (renamed from src/ts-lang/builtin/index.ts) | 0 | ||||
| -rw-r--r-- | src/lang/ts-lang/builtin/sbuiltin.ts (renamed from src/ts-lang/builtin/sbuiltin.ts) | 0 | ||||
| -rw-r--r-- | src/lang/ts-lang/core/common.ts (renamed from src/ts-lang/core/common.ts) | 0 | ||||
| -rw-r--r-- | src/lang/ts-lang/core/eval.ts (renamed from src/ts-lang/core/eval.ts) | 0 | ||||
| -rw-r--r-- | src/lang/ts-lang/core/index.ts (renamed from src/ts-lang/core/index.ts) | 0 | ||||
| -rw-r--r-- | src/lang/ts-lang/core/lexer.ts (renamed from src/ts-lang/core/lexer.ts) | 0 | ||||
| -rw-r--r-- | src/lang/ts-lang/core/parser.ts (renamed from src/ts-lang/core/parser.ts) | 0 | ||||
| -rw-r--r-- | src/lang/ts-lang/index.ts (renamed from src/ts-lang/index.ts) | 0 | ||||
| -rw-r--r-- | src/lang/ts-lang/util/index.ts (renamed from src/ts-lang/util/index.ts) | 0 | ||||
| -rw-r--r-- | src/lang/ts-lang/util/number.ts (renamed from src/ts-lang/util/number.ts) | 0 | ||||
| -rw-r--r-- | src/lang/ts-lang/util/string.ts (renamed from src/ts-lang/util/string.ts) | 0 | ||||
| -rw-r--r-- | src/lang/ts-lang/util/utils.ts (renamed from src/ts-lang/util/utils.ts) | 0 | ||||
| -rw-r--r-- | src/test.ts | 7 |
25 files changed, 38 insertions, 2 deletions
diff --git a/src/index.ts b/src/index.ts index ab79901..923d0b5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,2 +1 @@ -export * from "./ts-lang"; -export * from "./js-lang"; +export * from "./lang"; diff --git a/src/lang/index.ts b/src/lang/index.ts new file mode 100644 index 0000000..e9325ad --- /dev/null +++ b/src/lang/index.ts @@ -0,0 +1,3 @@ +export * from "./ts-lang"; +export * from "./ks-lang"; +export * from "./js-lang"; diff --git a/src/js-lang/builtin/builtin.ts b/src/lang/js-lang/builtin/builtin.ts index dde91b6..dde91b6 100644 --- a/src/js-lang/builtin/builtin.ts +++ b/src/lang/js-lang/builtin/builtin.ts diff --git a/src/js-lang/builtin/index.ts b/src/lang/js-lang/builtin/index.ts index 00e77f7..00e77f7 100644 --- a/src/js-lang/builtin/index.ts +++ b/src/lang/js-lang/builtin/index.ts diff --git a/src/js-lang/builtin/sbuiltin.ts b/src/lang/js-lang/builtin/sbuiltin.ts index 44c969d..44c969d 100644 --- a/src/js-lang/builtin/sbuiltin.ts +++ b/src/lang/js-lang/builtin/sbuiltin.ts diff --git a/src/js-lang/core/eval.ts b/src/lang/js-lang/core/eval.ts index 60a2059..60a2059 100644 --- a/src/js-lang/core/eval.ts +++ b/src/lang/js-lang/core/eval.ts diff --git a/src/js-lang/core/index.ts b/src/lang/js-lang/core/index.ts index 22ac2d2..22ac2d2 100644 --- a/src/js-lang/core/index.ts +++ b/src/lang/js-lang/core/index.ts diff --git a/src/js-lang/core/lexer.ts b/src/lang/js-lang/core/lexer.ts index 95e0e19..95e0e19 100644 --- a/src/js-lang/core/lexer.ts +++ b/src/lang/js-lang/core/lexer.ts diff --git a/src/js-lang/core/parser.ts b/src/lang/js-lang/core/parser.ts index f193d6a..f193d6a 100644 --- a/src/js-lang/core/parser.ts +++ b/src/lang/js-lang/core/parser.ts diff --git a/src/js-lang/index.ts b/src/lang/js-lang/index.ts index 8d119de..8d119de 100644 --- a/src/js-lang/index.ts +++ b/src/lang/js-lang/index.ts diff --git a/src/lang/ks-lang/index.ts b/src/lang/ks-lang/index.ts new file mode 100644 index 0000000..c60203f --- /dev/null +++ b/src/lang/ks-lang/index.ts @@ -0,0 +1,27 @@ +import { callFn, emptyStackFrame, evaluate, lex, parse } from "../js-lang"; +import { + Evaluate, + FnPrim, + Lex, + Parse, + EvalError, + CallFn, + EmptyStackFrame, +} from "../ts-lang"; + +export const createFn = <Program extends string>( + program: Program +): Evaluate<Parse<Lex<Program>>> extends [infer ProgramFn extends FnPrim] + ? <const Args extends any[]>( + ...args: Args + ) => CallFn<ProgramFn, Args, EmptyStackFrame> + : EvalError<"Cannot create a function from a program that does not eval to a function"> => { + const [programFn] = evaluate(parse(lex(program))) as Array<FnPrim>; + if (!programFn.fn) { + throw new Error( + "Cannot create a function from a program that does not eval to a function" + ); + } + + return ((...args: any[]) => callFn(programFn, args, emptyStackFrame)) as any; +}; diff --git a/src/ts-lang/builtin/builtin.ts b/src/lang/ts-lang/builtin/builtin.ts index a289867..a289867 100644 --- a/src/ts-lang/builtin/builtin.ts +++ b/src/lang/ts-lang/builtin/builtin.ts diff --git a/src/ts-lang/builtin/index.ts b/src/lang/ts-lang/builtin/index.ts index de2bee3..de2bee3 100644 --- a/src/ts-lang/builtin/index.ts +++ b/src/lang/ts-lang/builtin/index.ts diff --git a/src/ts-lang/builtin/sbuiltin.ts b/src/lang/ts-lang/builtin/sbuiltin.ts index 01f197e..01f197e 100644 --- a/src/ts-lang/builtin/sbuiltin.ts +++ b/src/lang/ts-lang/builtin/sbuiltin.ts diff --git a/src/ts-lang/core/common.ts b/src/lang/ts-lang/core/common.ts index fa5cb7c..fa5cb7c 100644 --- a/src/ts-lang/core/common.ts +++ b/src/lang/ts-lang/core/common.ts diff --git a/src/ts-lang/core/eval.ts b/src/lang/ts-lang/core/eval.ts index 5f22299..5f22299 100644 --- a/src/ts-lang/core/eval.ts +++ b/src/lang/ts-lang/core/eval.ts diff --git a/src/ts-lang/core/index.ts b/src/lang/ts-lang/core/index.ts index 881cacf..881cacf 100644 --- a/src/ts-lang/core/index.ts +++ b/src/lang/ts-lang/core/index.ts diff --git a/src/ts-lang/core/lexer.ts b/src/lang/ts-lang/core/lexer.ts index bcd5785..bcd5785 100644 --- a/src/ts-lang/core/lexer.ts +++ b/src/lang/ts-lang/core/lexer.ts diff --git a/src/ts-lang/core/parser.ts b/src/lang/ts-lang/core/parser.ts index db6f3aa..db6f3aa 100644 --- a/src/ts-lang/core/parser.ts +++ b/src/lang/ts-lang/core/parser.ts diff --git a/src/ts-lang/index.ts b/src/lang/ts-lang/index.ts index 8d119de..8d119de 100644 --- a/src/ts-lang/index.ts +++ b/src/lang/ts-lang/index.ts diff --git a/src/ts-lang/util/index.ts b/src/lang/ts-lang/util/index.ts index 00a3e54..00a3e54 100644 --- a/src/ts-lang/util/index.ts +++ b/src/lang/ts-lang/util/index.ts diff --git a/src/ts-lang/util/number.ts b/src/lang/ts-lang/util/number.ts index 6e4e360..6e4e360 100644 --- a/src/ts-lang/util/number.ts +++ b/src/lang/ts-lang/util/number.ts diff --git a/src/ts-lang/util/string.ts b/src/lang/ts-lang/util/string.ts index 5772f40..5772f40 100644 --- a/src/ts-lang/util/string.ts +++ b/src/lang/ts-lang/util/string.ts diff --git a/src/ts-lang/util/utils.ts b/src/lang/ts-lang/util/utils.ts index ac36ca1..ac36ca1 100644 --- a/src/ts-lang/util/utils.ts +++ b/src/lang/ts-lang/util/utils.ts diff --git a/src/test.ts b/src/test.ts new file mode 100644 index 0000000..56b8eb9 --- /dev/null +++ b/src/test.ts @@ -0,0 +1,7 @@ +import { evaluate, lex, parse } from "./lang"; +import { createFn } from "./lang"; + +const adder = createFn("fn(x, add(x, 5))"); + +const result = adder(5); +console.log(result); |
