Skip to main content

Minimal symbolic CLI calculator powered by SymPy

Project description

phil

A minimal command-line calculator for exact arithmetic, symbolic differentiation, integration, algebraic equation solving, and ordinary differential equations.

Powered by SymPy.

Install

Requires uv.

Install from PyPI (no clone required):

uv tool install philcalc

Then run:

phil

Project links:

Local Development Install

From a local clone:

uv tool install .

60-Second Start

uv tool install philcalc
phil --help
phil '1/3 + 1/6'
phil '(1 - 25e^5)e^{-5t} + (25e^5 - 1)t e^{-5t} + t e^{-5t} ln(t)'
phil

Then in REPL, try:

  1. d(x^3 + 2*x, x)
  2. int(sin(x), x)
  3. solve(x^2 - 4, x)

Usage

One-shot

phil '<expression>'
phil --format pretty '<expression>'
phil --format json '<expression>'
phil --no-simplify '<expression>'
phil --explain-parse '<expression>'
phil --latex '<expression>'
phil --latex-inline '<expression>'
phil --latex-block '<expression>'
phil --wa '<expression>'
phil --wa --copy-wa '<expression>'
phil --color auto '<expression>'
phil --color always '<expression>'
phil --color never '<expression>'
phil "ode y' = y"
phil "ode y' = y, y(0)=1"
phil --latex 'dy/dx = y'
phil 'dsolve(Eq(d(y(x), x), y(x)), y(x))'
phil :examples
phil :tutorial
phil :ode

Interactive

phil
phil> <expression>

REPL commands:

  • :h / :help show help
  • :examples show sample expressions
  • :tutorial / :tour show guided first-run tour
  • :ode show ODE cheat sheet and templates
  • :next / :repeat / :done control interactive tutorial mode
  • :v / :version show current version
  • :update / :check compare current vs latest version and print update command
  • :q / :quit / :x exit

The REPL starts with a short hint line and prints targeted hint: messages on common errors. On interactive terminals, REPL startup also prints whether your installed version is up to date. Unknown : commands return a short correction hint. Evaluation errors also include: hint: try WolframAlpha: <url>. Complex expressions also print a WolframAlpha equivalent hint after successful evaluation. REPL sessions also keep ans (last result) and support assignment such as A = Matrix([[1,2],[3,4]]). REPL also accepts inline CLI options, e.g. --latex d(x^2, x) or phil --latex "d(x^2, x)". For readable ODE solving, use ode ... input (example: ode y' = y).

Help

phil --help

Wolfram helper

  • By default, complex expressions print a WolframAlpha equivalent link.
  • Links are printed as full URLs for terminal auto-linking (including iTerm2).
  • Use --wa to always print the link.
  • Use --copy-wa to copy the link to your clipboard when shown.
  • Full URLs are usually clickable directly in modern terminals.

Color diagnostics

  • Use --color auto|always|never to control ANSI color on diagnostic lines (E: and hint:).
  • Default is --color auto (enabled only on TTY stderr, disabled for pipes/non-interactive output).
  • NO_COLOR disables auto color.
  • --color always forces color even when output is not a TTY.

Interop Output

  • --format json prints a compact JSON object with input, parsed, and result.
  • --format json keeps diagnostics on stderr, so stdout remains machine-readable.

Clear Input/Output Mode

  • Use --format pretty for easier-to-scan rendered output.
  • Use --explain-parse to print hint: parsed as: ... on stderr before evaluation.
  • Combine with relaxed parsing for shorthand visibility, e.g. phil --explain-parse 'sinx'.
  • stdout stays result-only, so pipes/scripts remain predictable.

Updates

From published package (anywhere):

uv tool upgrade philcalc

From a local clone of this repo:

uv tool install --force --reinstall --refresh .

Quick check in CLI:

phil :version
phil :update
phil :check

In REPL:

  • Startup (interactive terminals) prints a one-line up-to-date or update-available status.
  • :version shows your installed version.
  • :update/:check show current version, latest known release, and update command.

For release notifications on GitHub, use "Watch" -> "Custom" -> "Releases only" on the repo page.

Release

Tagged releases are published to PyPI automatically via GitHub Actions trusted publishing.

git pull
git tag -a v0.2.0 -m "Release v0.2.0"
git push origin v0.2.0
# or
scripts/release.sh 0.2.0

Then verify:

Long Expressions (easier input)

phil now uses relaxed parsing by default:

  • 2x works like 2*x
  • sinx works like sin(x) (with a hint: notice)
  • {} works like ()
  • ln(t) works like log(t)

So inputs like these work directly:

phil '(1 - 25e^5)e^{-5t} + (25e^5 - 1)t e^{-5t} + t e^{-5t} ln(t)'
phil '(854/2197)e^{8t}+(1343/2197)e^{-5t}+((9/26)t^2 -(9/169)t)e^{8t}'
phil 'dy/dx = y'

Use strict parsing if needed:

phil --strict '2*x'

Examples

$ phil '1/3 + 1/6'
1/2

$ phil 'd(x^3 + 2*x, x)'
3*x**2 + 2

$ phil 'int(sin(x), x)'
-cos(x)

$ phil 'solve(x^2 - 4, x)'
[-2, 2]

$ phil 'N(pi, 30)'
3.14159265358979323846264338328

$ phil --latex 'd(x^2, x)'
2 x

$ phil --latex-inline 'd(x^2, x)'
$2 x$

$ phil --latex-block 'd(x^2, x)'
$$
2 x
$$

$ phil --format pretty 'Matrix([[1,2],[3,4]])'
[1  2]
[3  4]

Test

uv run --group dev pytest
# full local quality gate
scripts/checks.sh

GitHub

  • CI: .github/workflows/ci.yml runs tests on pushes and PRs.
  • License: MIT (LICENSE).
  • Ignore rules: Python/venv/cache (.gitignore).
  • Contribution guide: CONTRIBUTOR.md.

Learn by Doing

Try this sequence in REPL mode:

  1. 1/3 + 1/6
  2. d(x^3 + 2*x, x)
  3. int(sin(x), x)
  4. solve(x^2 - 4, x)
  5. N(pi, 20)

If you get stuck, run :examples or :h.

Reference

Operations

Operation Syntax
Derivative d(expr, var)
Integral int(expr, var)
Solve equation solve(expr, var)
Solve ODE dsolve(Eq(...), func)
Equation Eq(lhs, rhs)
Numeric eval N(expr, digits)
Matrix determinant det(Matrix([[...]]))
Matrix inverse inv(Matrix([[...]]))
Matrix rank rank(Matrix([[...]]))
Matrix eigenvalues eigvals(Matrix([[...]]))

Symbols

x, y, z, t, pi, e, f

Functions

sin, cos, tan, exp, log, sqrt, abs

Matrix helpers

Matrix, eye, zeros, ones, det, inv, rank, eigvals

Syntax notes

  • ^ is exponentiation (x^2)
  • ! is factorial (5!)
  • relaxed mode (default) allows implicit multiplication (2x); use --strict to require 2*x
  • d(expr) / int(expr) infer the variable when exactly one symbol is present
  • Leibniz shorthand is accepted: d(sin(x))/dx, df(t)/dt
  • ODE shorthand is accepted: dy/dx = y, y' = y, y'' + y = 0
  • LaTeX-style ODE shorthand is accepted: \frac{dy}{dx} = y, \frac{d^2y}{dx^2} + y = 0
  • Common LaTeX wrappers and commands are normalized: $...$, \(...\), \sin, \cos, \ln, \sqrt{...}, \frac{a}{b}
  • name = expr assigns in REPL session (ans is always last result)
  • Undefined symbols raise an error

Safety limits

  • Expressions longer than 2000 chars are rejected.
  • Inputs containing blocked tokens like __, ;, or newlines are rejected.

See DESIGN.md for implementation details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

philcalc-0.1.13.tar.gz (41.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

philcalc-0.1.13-py3-none-any.whl (17.2 kB view details)

Uploaded Python 3

File details

Details for the file philcalc-0.1.13.tar.gz.

File metadata

  • Download URL: philcalc-0.1.13.tar.gz
  • Upload date:
  • Size: 41.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for philcalc-0.1.13.tar.gz
Algorithm Hash digest
SHA256 35f6ba7a5e7196e273460fa2dc70d3b68f322fc54706056b5b4822af06fa83d8
MD5 8aa163d8b27496c460c682188e416e4f
BLAKE2b-256 8782722ae950330b863bf3a539f8ff3e73ca21b2be0bcdfd6039a4aed391bb2e

See more details on using hashes here.

File details

Details for the file philcalc-0.1.13-py3-none-any.whl.

File metadata

  • Download URL: philcalc-0.1.13-py3-none-any.whl
  • Upload date:
  • Size: 17.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for philcalc-0.1.13-py3-none-any.whl
Algorithm Hash digest
SHA256 dba61e8bd791135f8d6fd8bf3251b37fea1dba4776124a7b2b4ec782792acf01
MD5 bae877abad231e1b4e9af1c7e253ea43
BLAKE2b-256 93701b0c60d4e6fd566abef01a568e9a6a2114ed96a572a768a05e87f6c12c7b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page