Built-in Functions Available in Monty: Complete Guide to the Rust Python Interpreter
Monty implements 35 Python built-in functions—including print, len, sum, and enumerate—as a Rust BuiltinsFunctions enum that compiles to a CALL_BUILTIN opcode for efficient VM dispatch.
The pydantic/monty repository is a Rust-based Python interpreter designed for high-performance execution of Python code. Understanding which built-in functions are available in Monty is essential for developers porting existing Python scripts to this runtime. Monty exposes these functions through a centralized BuiltinsFunctions enum defined in crates/monty/src/builtins/mod.rs, providing direct Rust implementations of CPython's standard utilities.
How Monty Dispatches Built-in Functions
Monty handles built-in function calls through a three-stage pipeline that avoids Python-level attribute lookups by encoding built-ins directly into the bytecode.
Parsing and Resolution
When the parser encounters an identifier matching a built-in name, it resolves the token to a BuiltinsFunctions variant. This occurs in crates/monty/src/parse.rs, where the parser maintains a mapping of valid built-in names to their corresponding enum discriminants.
Bytecode Generation
During compilation in crates/monty/src/bytecode/compiler.rs, the compiler emits a CALL_BUILTIN opcode with the enum discriminant (as a u8) as the operand. This hardcodes the target function into the bytecode, eliminating the need for runtime name resolution.
VM Execution
The virtual machine executes the CALL_BUILTIN opcode in crates/monty/src/bytecode/vm/call.rs. The VM uses BuiltinsFunctions::from_repr to convert the discriminant back to the enum variant, then invokes BuiltinsFunctions::call, which forwards to the appropriate implementation module (e.g., crates/monty/src/builtins/print.rs).
Complete List of Built-in Functions Available in Monty
Monty currently implements 35 built-in functions, covering core computational, type conversion, and iterable operations. The following table lists all available functions alphabetically with their implementation modules:
| Function | Module | Behavior |
|---|---|---|
abs |
abs.rs |
Returns absolute value of a number |
all |
all.rs |
Returns True if all elements of an iterable are true |
any |
any.rs |
Returns True if any element of an iterable is true |
bin |
bin.rs |
Converts integer to binary string representation |
chr |
chr.rs |
Converts Unicode code point to character string |
divmod |
divmod.rs |
Returns tuple of quotient and remainder |
enumerate |
enumerate.rs |
Returns iterator of tuples with index and value |
hash |
hash.rs |
Returns hash value of an object |
hex |
hex.rs |
Converts integer to hexadecimal string |
id |
id.rs |
Returns identity (memory address) of an object |
isinstance |
isinstance.rs |
Checks object type membership |
len |
len.rs |
Returns length of a container |
max |
min_max.rs |
Returns maximum of iterable or arguments |
min |
min_max.rs |
Returns minimum of iterable or arguments |
next |
next.rs |
Retrieves next item from iterator |
oct |
oct.rs |
Converts integer to octal string |
ord |
ord.rs |
Returns Unicode code point of a character |
pow |
pow.rs |
Performs exponentiation |
print |
print.rs |
Writes to stdout via PrintWriter |
repr |
repr.rs |
Returns official string representation |
reversed |
reversed.rs |
Returns reversed iterator |
round |
round.rs |
Rounds number to nearest integer |
sorted |
sorted.rs |
Returns sorted list from iterable |
sum |
sum.rs |
Sums items of an iterable |
type |
type_.rs |
Returns type object of an argument |
zip |
zip.rs |
Aggregates elements from multiple iterables |
Future Implementations
The BuiltinsFunctions enum in crates/monty/src/builtins/mod.rs contains commented-out placeholders for additional built-ins not yet implemented. These include bool, bytes, dict, open, range, and __import__. These variants are reserved for future releases as the interpreter matures.
Practical Examples Using Monty Built-ins
The following examples demonstrate how to use the built-in functions available in Monty through both the Python bindings and the native Rust API.
Python API via pydantic_monty
When using Monty through its Python bindings, built-in functions work identically to CPython:
from pydantic_monty import Monty
source = """
print('Hello, Monty!')
print('Length of list:', len([1, 2, 3]))
print('Sum of range:', sum(range(5)))
print('Sorted list:', sorted([3, 1, 4, 2]))
print('Absolute value:', abs(-42))
print('Binary of 10:', bin(10))
print('Max of args:', max(1, 4, 2))
"""
m = Monty(source)
result = m.run()
print('Monty returned:', result)
Rust API Integration
For Rust developers embedding Monty directly, built-ins are invoked through the VM's execution context:
use monty::{
Monty,
heap::Heap,
resource::SimpleResourceTracker,
io::StdoutWriter,
};
let code = r#"
print('abs(-7) =', abs(-7))
print('max(1, 4, 2) =', max(1, 4, 2))
print('enumerate result:', list(enumerate(['a', 'b'])))
"#;
let mut heap = Heap::new(SimpleResourceTracker::default());
let mut writer = StdoutWriter;
let mut vm = Monty::new(&code, &mut heap, &mut writer);
vm.run().expect("execution should succeed");
Both examples demonstrate that Monty's built-in functions accept the same arguments and produce the same results as CPython, routed through the BuiltinsFunctions dispatch system.
Key Source Files for Built-in Functions
Understanding the architecture of Monty's built-ins requires examining these specific source files:
| File | Role |
|---|---|
crates/monty/src/builtins/mod.rs |
Defines the BuiltinsFunctions enum and central call dispatch method |
crates/monty/src/builtins/print.rs |
Implements print with PrintWriter integration for stdout handling |
crates/monty/src/builtins/len.rs |
Container length implementation |
crates/monty/src/builtins/sum.rs |
Iterable summation logic |
crates/monty/src/builtins/min_max.rs |
Shared implementation for min and max |
crates/monty/src/parse.rs |
Resolves identifier tokens to BuiltinsFunctions variants during AST construction |
crates/monty/src/bytecode/compiler.rs |
Emits CALL_BUILTIN opcodes with enum discriminants as operands |
crates/monty/src/bytecode/vm/call.rs |
VM opcode handler that converts discriminants back to enum variants and invokes the implementation |
These files collectively demonstrate how Monty discovers, compiles, and executes built-in functions without requiring runtime symbol table lookups.
Summary
- Monty implements 35 built-in functions available in the
pydantic/montyinterpreter, ranging fromabsandbintozipandenumerate. - The dispatch mechanism uses a Rust
BuiltinsFunctionsenum incrates/monty/src/builtins/mod.rs, compiled to aCALL_BUILTINopcode for zero-overhead runtime performance. - Current implementations cover core computational, iterable, and introspection utilities, while placeholders exist for future additions like
bool,bytes,dict,open,range, and__import__. - Both Python bindings (
pydantic_monty) and native Rust APIs provide seamless access to these functions with CPython-compatible semantics.
Frequently Asked Questions
How does Monty's built-in function dispatch differ from CPython?
Monty encodes each built-in as a variant of the BuiltinsFunctions enum rather than using global function objects. During bytecode generation in crates/monty/src/bytecode/compiler.rs, the compiler emits a CALL_BUILTIN opcode containing the enum discriminant as a u8 operand. The VM then uses BuiltinsFunctions::from_repr to resolve this discriminant to the correct Rust implementation, eliminating the runtime overhead of Python attribute lookups and dictionary searches required by CPython's builtins module.
Which essential Python built-ins are not yet available in Monty?
While Monty offers 35 built-in functions covering mathematical operations (abs, pow, round), iterable processing (len, sum, max, min, sorted), and type conversion (bin, hex, chr, ord), several critical built-ins remain unimplemented. The BuiltinsFunctions enum in crates/monty/src/builtins/mod.rs contains commented-out placeholders for bool, bytes, dict, open, range, and __import__. These will be enabled in future releases as the interpreter's standard library support expands.
How is the print function implemented in Monty?
The print built-in is implemented in crates/monty/src/builtins/print.rs and integrates with Monty's I/O subsystem through the PrintWriter trait. Unlike a simple wrapper around stdout, this implementation allows the VM to direct output to configurable sinks during execution. When the VM encounters a CALL_BUILTIN opcode for the print discriminant, it invokes BuiltinsFunctions::call, which delegates to the formatting and writing logic in print.rs to process arguments and emit them via the configured PrintWriter.
Can I use Monty as a drop-in replacement for CPython in existing projects?
Monty can execute Python scripts that rely on the 35 currently implemented built-in functions, making it suitable for pure computational workloads, data processing with iterables, and basic introspection tasks. However, because essential built-ins like open, range, dict, and bool are not yet implemented—as indicated by their placeholder status in crates/monty/src/builtins/mod.rs—Monty cannot yet run full CPython applications that require file I/O, dictionary data structures, or boolean type construction. For supported operations, the pydantic_monty Python bindings provide CPython-compatible semantics.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →