toRustCalcMCP
Un puerto en Rust de calc (la calculadora de precisión arbitraria de Landon Curt Noll)
Documentación
toRustCalcMCP
Un port a Rust de calc (la calculadora de precisión arbitraria
de Landon Curt Noll) que funciona como:
rcalc— una calculadora de línea de comandos compatible con calc- REPL web — calculadora interactiva basada en navegador
- Servidor MCP — JSON-RPC 2.0 sobre stdio para integración con LLM/agentes
Tres interfaces, un mismo motor. El núcleo numérico usa aritmética racional exacta
(num-rational sobre num-bigint), que es el mismo modelo que calc usa de forma nativa,
por lo que 1/3 * 3 es exactamente 1, y 2^256 se calcula hasta el último dígito.
👉 Primeros pasos en 2 minutos — ¿nuevo en rcalc? Empieza aquí. 👉 Instalar como MCP de Claude Desktop — intégralo con Claude Desktop.
Compilación
cargo build --release
# binaries:
# target/release/toRustCalcMCP (auto-detects MCP vs CLI)
# target/release/rcalc (always the CLI)
Opcionalmente, crea un enlace simbólico: ln -s toRustCalcMCP rcalc — cuando argv[0] es rcalc,
toRustCalcMCP se comporta como la calculadora.
Uso de CLI (rcalc)
rcalc '2^100' # 1267650600228229401496703205376
rcalc '1/3 + 1/6' # 0.5
rcalc -m frac '1/3 + 1/6' # 1/2
rcalc 'gcd(462,1071)' # 21
rcalc 'fact(30)' # 265252859812191058636308480000000
rcalc 'sqrt(2)' # 1.4142135623730950488
rcalc 'isprime(1000003)' 'nextprime(1000003)' # 1 \n 1000033
echo '3*4' | rcalc -p # pipe mode
rcalc # interactive REPL (Ctrl-D to exit)
Banderas: -p modo tubería, -q silencioso, -m real|frac|int, -v versión, -h ayuda.
Varias banderas clásicas de calc (-c -C -d -e -i -O -s -u) se aceptan e ignoran.
Uso del REPL web
cargo build --release
./target/release/rcalc-web
# Open browser: http://localhost:8888
Un REPL moderno basado en navegador con:
- Evaluación interactiva de expresiones
- Historial de comandos (flechas ↑/↓)
- Salida con resaltado de sintaxis
- Funcionalidad completa de calc (483 nombres integrados)
- Diseño adaptable para móvil/escritorio
Pruébalo: abre http://localhost:8888 e introduce 2^256 o sin(pi()/6).
Uso de MCP
toRustCalcMCP --mcp # speak JSON-RPC 2.0 over stdio
Protocolo de inicio → initialize, luego tools/list, luego tools/call. Consulta
docs/MCP_TOOL_SCHEMA.json para el esquema autoritativo
emitido por el servidor y examples/mcp-config.json
para un fragmento de registro de cliente.
Herramientas
| herramienta | propósito | argumentos clave |
|---|---|---|
calc_eval | evaluar una expresión | expression (obligatorio), mode, digits, epsilon |
calc_config | obtener/establecer precisión y visualización de la sesión | action (get/set), mode, digits, epsilon |
calc_functions | listar funciones integradas | filter (subcadena opcional) |
Los mode/digits/epsilon de calc_eval son anulaciones por llamada; calc_config set
los cambia para la sesión.
Lenguaje soportado
- Operadores:
+ - * /(exacto),//(división entera),%(módulo),^/**(potencia), comparaciones== != < <= > >=(producen1/0), unarios-/+. - Variables y asignación:
x = 7; x^2. - Funciones definidas por el usuario:
define f(x) = x^2; f(5)→25. - Flujo de control:
if/else,while, buclesfor, bloques con{}. - Sentencias separadas por
;; el valor de cada una se imprime (comportamiento de calc). - Literales numéricos: enteros, racionales
a/b, decimales,1.2e-3,0x/0b. - Listas:
list(1,2,3); append(x,4); slice(x,1,3). - Números complejos:
sqrt(-1)→i; aritmética con+,-,*,/. - Literales de cadena:
"hello"; strlen(s); index(haystack, needle). - 483 nombres integrados (paridad completa con los 350 de calc, menos 15 internos documentados del intérprete, más extensiones) — consulta el estado de implementación más abajo.
Modelo de precisión
Los números son racionales exactos. Los resultados irracionales se aproximan dentro de la
epsilon de la sesión (por defecto exacto 1/10^20), igual que calc. Las funciones trascendentes (exp,
ln, sin, cos, tan) se calculan con precisión arbitraria mediante series de Taylor
y el método de Newton. sqrt, sin, cos, etc. convergen hasta que el término < épsilon.
pi/e son constantes de 60 dígitos. Un ~ inicial en la salida en modo real marca una
representación inexacta (redondeada/no terminante), como en calc.
Estado de implementación — paridad completa con upstream ✅
El upstream de calc (lcn2/calc func.c) define 350 funciones integradas. Este port registra
483 nombres integrados que cubren 335 de los 350 integrados de upstream (los otros
148 que faltaban desde hace tiempo se añadieron en los lotes de paridad con upstream que se indican más abajo),
además de docenas de extensiones y alias más allá de upstream (estadística, hashing,
trucos de bits, información del sistema, y más).
Intencionalmente no implementados (15 internos del intérprete)
Estos nombres de upstream son artefactos del intérprete C de calc y no tienen un mapeo significativo a la arquitectura de este port; permanecen sin implementar en lugar de enviar stubs falsos:
access, calc_tty, calclevel, calcpath, custom, dp, estr,
inputlevel, memsize, name, param, prompt, protect, saveval,
stoponerror
Desviaciones conocidas respecto a upstream
- Las funciones integradas con parámetros de salida devuelven valores en su lugar:
d2dm/d2dms(y la familia g/h) devuelven listas de[deg, min]/[deg, min, sec];quomoddevuelve[q, r];search/rsearchdevuelven un índice o null. - Las funciones integradas in-place/lvalue devuelven nuevos valores:
modify,copy,swap(las funciones integradas reciben valores, no referencias). base2()se lee como 0 (sin base secundaria); establecerlo da error — el renderizador tiene una única base de salida.free*()son no-ops: no se almacena nada en caché, los valores se calculan bajo demanda.
Características completas del lenguaje
- ✅ Funciones definidas por el usuario (
define name(params) = expr), funciones integradas de orden superior (select/forall/modifyllaman a valores de función) - ✅ Flujo de control (
if/else,while, buclesfor) - ✅ Variables y ámbito
- ✅ Listas e indexación (basada en 0, con soporte de índices negativos)
- ✅ Números complejos con aritmética completa
- ✅ Literales de cadena y un conjunto completo de funciones de cadena
- ✅ Conversión de base (2-36, entrada y salida)
- ✅ Aritmética de precisión arbitraria (racionales exactos; épsilon exacto de 1/10^20)
- ✅ Carga de archivos (
-f filename), funciones integradas de E/S de archivos, REPL, modo tubería
Alcance — Arquitectura y diseño
El upstream de calc tiene ~92,000 líneas de C con ~350 funciones integradas y un lenguaje de scripting completo y Turing-completo. Este port es un núcleo fiel, estructurado para una expansión incremental y aditiva:
- ✅ Motor numérico de racionales exactos — coincide con el modelo nativo de calc
- ✅ Lexer/parser completo — maneja la sintaxis completa de expresiones
- ✅ Evaluador por recorrido de árbol — con funciones definidas por el usuario, flujo de control, ámbito
- ✅ Registro de funciones integradas — mapa de funciones extensible con catalogación automática
- ✅ CLI y servidor MCP — dos interfaces, un motor
- 🔄 Funciones integradas incrementales — cada categoría encaja limpiamente sin rehacer trabajo
La arquitectura es estable; añadir más funciones es sencillo.
Licencia
LGPL-2.1, coincidiendo con el upstream de calc.