A simple Jupyter kernel for Hy, a pythonic lisp.
The Hy tutorial as a Jupyter Notebook
- basic REPL functionality
- autocomplete with most special Hy constructs
- syntax highlighting from lighttable-hylang
- cell and line magics
- interactive widgets
- pretty good tests
pip install hy_kernel
You can try out Hy Kernel in Docker with Docker Compose:
git clone https://github.com/bollwyvl/hy_kernel.git
cd hy_kernel && docker-compose up
To start the notebook in your directory of choice, with a running Hy kernel:
ipython console --kernel hy
Or the notebook web GUI:
ipython notebook
Or:
ipython qtconsole --kernel hy
Or:
Your GUI might have a kernel selector: In the Web GUI it's in the
upper-right-hand corner. Find it, and select Hy
kernel from the kernel
selector.
This kernel subclasses IPythonKernel directly, as opposed to using KernelBase, which would probably the correct thing to do. This works, but might be brittle. Each cell is run through astor, so you're actually seeing hy → ast → py → ast. While this probably incurs additional overhead, the benefits (free magics, widgets, all the history works) are just too great to give up.
A lot of things don't work quite right in the qt console, and this will not be supported to the same extent as the HTML notebook and terminal console.
Issue #5
Use of operators e.g. *
, +
, /
as the left-most atom in an expression appears to
work:
;; works
(+ 1 1)
Using operators as just about anything else doesn't:
;; breaks
(reduce + [1 2 3])
Use the operator
module:
(import (operator (mul add)))
(reduce mul [1 2 3])
This will probably need to be fixed upstream.
Cell and line magics are "supported", with the following caveats.
Issue #13
Because we don't have much whitespace control over what gets compiled, and can't do dirty tricks with comments (the hy compiler strips them), inline/indented line magics are probably not going to work.
;; breaks
(if True (
!ls
))
Additionally, cell magics that should not be parsed as Hy need to be extra-
magiced, with %%%
. This is because there is no way to know whether a
particular magic expects python, or some other crazy thing e.g. html, ruby,
a file... not that %%file
works anyway (see #12).
%%html
<h1>This Breaks!</h1>
breaks, while
%%%html
<h1>This Works!</h1>
works.
Issues, pull requests, and forks are all supported and encouraged on the Github repository.
This discussion on hylang-discuss
is also a good place to chime in.
Additionally, the Jupyter list can provide a larger perspective on how this stuff fits into the larger picture of interactive computing.