Skip to content

Commit

Permalink
optimize out unnecessary recursion
Browse files Browse the repository at this point in the history
  • Loading branch information
maxdeliso committed Jun 30, 2024
1 parent f376aae commit e0854f4
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 29 deletions.
4 changes: 0 additions & 4 deletions lib/parser/recursiveDescentBuffer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,4 @@ export class RecursiveDescentBuffer {
this.consume()
return next
}

peelRemaining (): RecursiveDescentBuffer {
return new RecursiveDescentBuffer(this.buf.slice(this.idx))
}
}
22 changes: 10 additions & 12 deletions lib/parser/typed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,17 +63,6 @@ function parseTypeInternal (rdb: RecursiveDescentBuffer): [string, Type] {
}
}
}
function parseLambdaInternal (rdb: RecursiveDescentBuffer):
[string, TypedLambda] {
rdb.matchCh('λ')
const varLit = rdb.parseVariable()
rdb.matchCh(':')
const [typeLit, ty] = parseTypeInternal(rdb)
rdb.matchCh('.')
const [bodyLit, term] = parseTypedLambdaInternal(rdb.peelRemaining())
rdb.consumeN(bodyLit.length)
return [${varLit}:${typeLit}.${bodyLit}`, mkTypedAbs(varLit, ty, term)]
}

function parseTypedLambdaInternal (rdb: RecursiveDescentBuffer):
[string, TypedLambda] {
Expand All @@ -84,7 +73,16 @@ function parseTypedLambdaInternal (rdb: RecursiveDescentBuffer):
let nextTerm: TypedLambda

if (rdb.peek() === 'λ') {
const [lambdaLit, lambdaTerm] = parseLambdaInternal(rdb)
rdb.matchCh('λ')
const varLit = rdb.parseVariable()
rdb.matchCh(':')
const [typeLit, ty] = parseTypeInternal(rdb)
rdb.matchCh('.')
const [bodyLit, term] = parseTypedLambdaInternal(rdb)
const [lambdaLit, lambdaTerm] = [
${varLit}:${typeLit}.${bodyLit}`,
mkTypedAbs(varLit, ty, term)
]
nextTerm = lambdaTerm
resultStr += lambdaLit
} else {
Expand Down
19 changes: 6 additions & 13 deletions lib/parser/untyped.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,12 @@ function parseUntypedLambdaInternal (rdb: RecursiveDescentBuffer):
let nextTerm: UntypedLambda | undefined

if (rdb.peek() === 'λ') {
const [lambdaLit, lambdaTerm] = parseUntypedLambda(rdb)
resultStr += lambdaLit
nextTerm = lambdaTerm
rdb.matchCh('λ')
const varLit = rdb.parseVariable()
rdb.matchCh('.')
const [bodyLit, term] = parseUntypedLambdaInternal(rdb)
resultStr += ${varLit}.${bodyLit}`
nextTerm = mkUntypedAbs(varLit, term)
} else if (rdb.peek() === '(') {
rdb.matchLP()
const [lit1, t1] = parseUntypedLambdaInternal(rdb)
Expand Down Expand Up @@ -49,13 +52,3 @@ function parseUntypedLambdaInternal (rdb: RecursiveDescentBuffer):

return [resultStr, resultExpr]
}

function parseUntypedLambda (rdb: RecursiveDescentBuffer):
[string, UntypedLambda] {
rdb.matchCh('λ')
const varLit = rdb.parseVariable()
rdb.matchCh('.')
const [bodyLit, term] = parseLambda(rdb.peelRemaining().buf)
rdb.consumeN(bodyLit.length)
return [${varLit}.${bodyLit}`, mkUntypedAbs(varLit, term)]
}

0 comments on commit e0854f4

Please sign in to comment.