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:
d(x^3 + 2*x, x)int(sin(x), x)solve(x^2 - 4, x)
Usage
One-shot
phil '<expression>'
phil --format pretty '<expression>'
phil --no-simplify '<expression>'
phil --latex '<expression>'
phil --latex-inline '<expression>'
phil --latex-block '<expression>'
phil --wa '<expression>'
phil --wa --copy-wa '<expression>'
phil :examples
Interactive
phil
phil> <expression>
REPL commands:
:h/:helpshow help:examplesshow sample expressions:v/:versionshow current version:update/:checkcompare current vs latest version and print update command:q/:quit/:xexit
The REPL starts with a short hint line and prints targeted hint: messages on common errors.
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]]).
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
--wato always print the link. - Use
--copy-wato copy the link to your clipboard when shown. - Full URLs are usually clickable directly in modern terminals.
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:
:versionshows your installed version.:update/:checkshow current version, latest known release, and update command.
For release notifications on GitHub, use "Watch" -> "Custom" -> "Releases only" on the repo page.
Long Expressions (easier input)
phil now uses relaxed parsing by default:
2xworks like2*x{}works like()ln(t)works likelog(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}'
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
GitHub
- CI:
.github/workflows/ci.ymlruns 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/3 + 1/6d(x^3 + 2*x, x)int(sin(x), x)solve(x^2 - 4, x)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--strictto require2*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 name = exprassigns in REPL session (ansis 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file philcalc-0.1.1.tar.gz.
File metadata
- Download URL: philcalc-0.1.1.tar.gz
- Upload date:
- Size: 28.7 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fc81e49b848fc669b53bf04c1d245c3cd507792277e35c0f7a578c54bbb9786f
|
|
| MD5 |
d54883469807a091762c7d169fe4ed38
|
|
| BLAKE2b-256 |
d5fccd88bd742eae05bd72abfac0b06e359dc48c264fb833a46ddb40c5455ac4
|
File details
Details for the file philcalc-0.1.1-py3-none-any.whl.
File metadata
- Download URL: philcalc-0.1.1-py3-none-any.whl
- Upload date:
- Size: 10.1 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d52fae5627ede9e8197d646546f8649030ebd14e1187364fac8ccf40ce09caf
|
|
| MD5 |
92a830f35c1925403cf94d9f4c57bc91
|
|
| BLAKE2b-256 |
eaf6501e4725d5a747126c176b6f42f60c4ae6c323c4b91848cdb9aa1b79b0be
|