xopgi.ql.lang.expressions – The expressions language

xopgi.ql.lang.expressions.parse(source: str, debug=False, tracking=False) → xopgi.ql.lang.expressions.base.AST[source]

Parse a single expression.

xopgi.ql.lang.expressions.find_free_names(expr: xopgi.ql.lang.expressions.base.AST) → List[str][source]

Find all names that appear free in expr.

Example:

>>> from xopgi.ql.lang.expressions import parse, find_free_names
>>> set(find_free_names(parse('let id x = x in map id xs')))
{'map', 'xs'}

Names can be repeated:

>>> find_free_names(parse('twice x x')).count('x')
2

The AST of the type expressions

class xopgi.ql.lang.expressions.base.Identifier(name: str)[source]

A name (variable if you like).

class xopgi.ql.lang.expressions.base.Literal(value: Any, type_: xopgi.ql.lang.types.base.Type, annotation: Any = None)[source]

A literal value with is type.

The parser only recognizes strings, chars, and numbers (integers and floats are represented by a single type).

Note

This is an extension to the algorithm, but you can easily that we may replace literals by identifiers with a predefined type.

class xopgi.ql.lang.expressions.base.Lambda(varname: str, body: xopgi.ql.lang.expressions.base.AST)[source]

A lambda abstraction over a single parameter.

class xopgi.ql.lang.expressions.base.Application(e1: xopgi.ql.lang.expressions.base.AST, e2: xopgi.ql.lang.expressions.base.AST)[source]

The application of e1 to its argument e2.

class xopgi.ql.lang.expressions.base.Let(bindings: Mapping[str, xopgi.ql.lang.expressions.base.AST], body: xopgi.ql.lang.expressions.base.AST)[source]

A non-recursive Let expression.

The parser automatically selects between Let and Letrec:class. If you’re creating the program by hand you should choose appropriately. (But the type-checker doesn’t really care.)

class xopgi.ql.lang.expressions.base.Letrec(bindings: Mapping[str, xopgi.ql.lang.expressions.base.AST], body: xopgi.ql.lang.expressions.base.AST)[source]

A recursive Let expression.

The type expression grammar