FAQ
What is Koskari for?
Writing programs in a Lisp that has Python’s libraries, objects, and
runtime. It suits code that wants macros, first-class continuations, or
ambient async, and code that wants to sit inside an existing Python
project: a .ki module imports from Python and imports Python back.
What is it not?
A replacement for Python. Koskari runs its own bytecode on its own evaluator inside CPython, and every value is a Python object. Programs that spend their time in library calls run at the speed of those libraries. On compute-bound kernels Koskari is often faster than the same Python: arithmetic loops, branching, attribute updates, structural match, and recursion. It runs slower where a kernel allocates heavily, does arbitrary-precision arithmetic, or crosses a coroutine boundary one call at a time.
Is it stable?
Koskari is pre-alpha software; 0.2.0 is in development and publishes as weekly snapshots. The language surface may change before 1.0, and the changelog records what did. Release and versioning says what kinds of change to expect.
Which Python versions and platforms?
CPython 3.9 through 3.14, on Linux and macOS, with wheels on PyPI for both. Windows is untested.
Is free-threading supported?
Not yet.
Can Python code call Koskari code?
Yes. After import koskari, a .ki module imports like any other, and
its functions and classes are ordinary Python callables. A function that
Python calls directly carries @demand above its def so it returns a
value rather than a coroutine; see
Interop.
Where do I report a bug?
The issue tracker on GitHub. Include the Koskari version, the exact
command, the full output, and the smallest .ki file that shows it.
For a documentation example that does not run as shown, name the page
and the section.
Common problems
koskari: command not found
The command is on your PATH once the package is installed:
pip install koskari from PyPI, or pip install -e . in a checkout. A
virtual environment has to be activated first.
Build fails: no C compiler, or “requires a compiler with musttail”
The evaluator threads opcode dispatch through guaranteed tail calls, so
building from source needs clang, or GCC 15 or newer. The build picks
clang when it is on the PATH; set CC to choose.
Debian and Ubuntu:
sudo apt install clang lldFedora and RHEL:
sudo dnf install clang lld, or GCC 15 from a toolsetmacOS:
xcode-select --install
Installing the PyPI wheel needs no compiler.
A Koskari function returns a coroutine when Python calls it
Every Koskari function can suspend, so a call from plain Python yields
a coroutine. Put @demand above the function’s def, or demand at
the call. Python’s map, filter, min, max, and list.sort
calling a Koskari lambda have the same cause. See
Demand, async, and defer.
#{name: "x"} raises NameError
Dict keys are expressions, so name: looks up a variable. Quote a
string key: #{"name": "x"}.
[1 2 3] is not a list
Square brackets read like parentheses, so that is a call of 1. A
list literal is #[1 2 3].
Elements are separated by whitespace, and a comma sticks to the token in
front of it: #[1, 2] reads the symbol 1, and the integer 2.