Skip to content

Commit

Permalink
feat(pointfree-lang): implement dynamic var scoping & local var grammar
Browse files Browse the repository at this point in the history
- add loadvar/storevar/beginvar/endvar word fns
- add `^{ x y }` syntax to autobind word local vars
- update var lookups/updates to use scope/binding stack (per var)
- update visitWord() to inject local var handling (if needed)
- update ensureEnv() to prepare var stacks
- add finalizeEnv() to resolve final var results and remove var stacks
- fix aliases
- add docs
  • Loading branch information
postspectacular committed Apr 3, 2018
1 parent 1c899a1 commit 3310ec3
Show file tree
Hide file tree
Showing 3 changed files with 238 additions and 35 deletions.
7 changes: 4 additions & 3 deletions packages/pointfree-lang/src/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export interface ASTNode {
body: any;
loc: [number, number];
id?: string;
locals: string[];
}

export interface VisitorState {
Expand Down Expand Up @@ -50,11 +51,11 @@ export const ALIASES: IObjectOf<pf.StackFn> = {
"v*": pf.vmul,
"v/": pf.vdiv,
"=": pf.eq,
"!=": pf.gteq,
"not=": pf.neq,
"<=": pf.lteq,
">=": pf.gteq,
"<": pf.lteq,
">": pf.gteq,
"<": pf.lt,
">": pf.gt,
"pos?": pf.ispos,
"neg?": pf.isneg,
"nil?": pf.isnull,
Expand Down
22 changes: 12 additions & 10 deletions packages/pointfree-lang/src/grammar.pegjs
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,18 @@ NonWordExpr
) _ { return ast(expr); }

Word
= ":" __ id:Sym body:NonWordExpr+ ";" {
return { type: NodeType.WORD, id: id.id, body};
= ":" __ id:Sym locals:LocalVars? body:NonWordExpr+ ";" {
return { type: NodeType.WORD, id: id.id, locals, body};
}

LocalVars
= _ "^{" body:SymList+ "}" {
return body;
}

SymList
= _ id:Sym _ { return id.id; }

Array
= "[" body:NonWordExpr* "]" {
return { type: NodeType.ARRAY, body };
Expand Down Expand Up @@ -93,18 +101,12 @@ Boolean
}

Sym
= id:$(SymV1) {
= id:$((Alpha / SymChars) (AlphaNum / SymChars)*) {
return {type: NodeType.SYM, id};
}

SymV1
= (Alpha / SymChars) (AlphaNum / SymChars / [.])*

SymV2
= Digit (AlphaNum / SymChars)+

SymChars
= [*?$%&/\|~<>=_+\-]
= [*?$%&/\|~<>=_.+\-]

Var
= VarDeref
Expand Down
Loading

0 comments on commit 3310ec3

Please sign in to comment.