mirror of
https://github.com/blackboxprogramming/lucidia.git
synced 2026-03-17 06:57:10 -05:00
77 lines
2.1 KiB
Python
77 lines
2.1 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass, field
|
|
from typing import Callable, Dict, Any, Protocol
|
|
|
|
|
|
class OperatorFunc(Protocol):
|
|
def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
|
|
|
|
|
|
@dataclass
|
|
class Operator:
|
|
"""
|
|
Represents a symbolic operator in Lucidia's Codex.
|
|
|
|
Attributes
|
|
----------
|
|
name : str
|
|
Unique identifier for the operator (e.g., "AND", "ELEVATE").
|
|
arity : int
|
|
Number of positional operands this operator expects.
|
|
impl : OperatorFunc
|
|
Concrete implementation callable.
|
|
description : str
|
|
Human-readable description of behavior and intent.
|
|
"""
|
|
name: str
|
|
arity: int
|
|
impl: OperatorFunc
|
|
description: str = ""
|
|
metadata: Dict[str, Any] = field(default_factory=dict)
|
|
|
|
def run(self, *args: Any, **kwargs: Any) -> Any:
|
|
if self.arity >= 0 and len(args) != self.arity:
|
|
raise ValueError(f"{self.name} expects arity {self.arity}, got {len(args)}")
|
|
return self.impl(*args, **kwargs)
|
|
|
|
|
|
class OperatorRegistry:
|
|
"""In-memory registry for Codex operators."""
|
|
def __init__(self) -> None:
|
|
self._ops: Dict[str, Operator] = {}
|
|
|
|
def register(self, op: Operator) -> None:
|
|
key = op.name.upper()
|
|
if key in self._ops:
|
|
raise KeyError(f"Operator already registered: {op.name}")
|
|
self._ops[key] = op
|
|
|
|
def get(self, name: str) -> Operator:
|
|
try:
|
|
return self._ops[name.upper()]
|
|
except KeyError as e:
|
|
raise KeyError(f"Unknown operator: {name}") from e
|
|
|
|
def call(self, name: str, *args: Any, **kwargs: Any) -> Any:
|
|
return self.get(name).run(*args, **kwargs)
|
|
|
|
|
|
# Minimal built-ins
|
|
def _op_identity(x: Any) -> Any:
|
|
return x
|
|
|
|
|
|
def _op_concat(a: str, b: str) -> str:
|
|
return f"{a}{b}"
|
|
|
|
|
|
REGISTRY = OperatorRegistry()
|
|
REGISTRY.register(Operator("IDENTITY", 1, _op_identity, "Return input unchanged."))
|
|
REGISTRY.register(Operator("CONCAT", 2, _op_concat, "Concatenate two strings."))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
print(REGISTRY.call("IDENTITY", {"hello": "world"}))
|
|
print(REGISTRY.call("CONCAT", "Lucid", "ia"))
|