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.
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 betweenLet
and Letrec:class. If you’re creating the program by hand you should choose appropriately. (But the type-checker doesn’t really care.)