OMG A Lisp that runs python

Posted March 30, 2016 at 05:10 PM | categories: lisp, python | tags:

Updated March 31, 2016 at 01:54 PM

For a year now I have struggled with abandoning Python for Lisp. It's complicated, I have used Python for 15 years now, and have a lot of skill and knowledge in it. I have used emacs-lisp for about 5 years now, and have a far bit of skill with it too. They solve really different problems. Between the two, I find I like writing and editing elisp lots better than writing Python, except it lacks the scipy+numpy+matplotlib stack. I looked into Racket and Common Lisp, but they also don't really have that as nicely as Python does at the moment. It hit me earlier today that a Lisp that compiled to Python might be the right middle ground. I had seen this project Hy (http://docs.hylang.org/en/latest/quickstart.html ) earlier, but didn't connect the dots to this.

Let me do that here. First, an obligatory execute function to run org-mode code blocks.

(defun org-babel-execute:hy (body params)
 (let* ((temporary-file-directory ".")
 (tempfile (make-temp-file "hy-")))
 (with-temp-file tempfile
 (insert body))
 (unwind-protect
 (shell-command-to-string
 (format "hy %s" tempfile))
 (delete-file tempfile))))
org-babel-execute:hy

Now the basic Hello world example. It looks like lisp.

(print "Hy world")
Hy world

Now for a use that looks like Python:

(import numpy)
(setv a (numpy.array [1 2 3]))
(setv b (numpy.array [1 2 3]))
(print (numpy.dot a b))
14

WHAT!!!!

A simple plot? Surely it can't be so easy…

(import [matplotlib.pyplot :as plt])
(plt.plot [1 2 4 8])
(plt.xlabel "x")
(plt.ylabel "y")
(plt.savefig "hy-test.png")
2016年03月30日 17:09:40.826 Python[94292:d13] CoreText performance note: Client called CTFontCreateWithName() using name "Lucida Grande" and got font with PostScript name "LucidaGrande". For best performance, only use PostScript names when calling this API.
2016年03月30日 17:09:40.826 Python[94292:d13] CoreText performance note: Set a breakpoint on CTFontLogSuboptimalRequest to debug.

Wow. I am not sure what the warnings are, I seem to get them on my Mac for some reason. How about solving an equation?

(import [scipy.optimize [fsolve]])
(defn objective [x] (- 2 x))
(print (fsolve objective -1))
[ 2.]
 _.-^^---....,,--
 _-- --_
< >)
| |
 \._ _./
 ```--. . , ; .--'''
 | | |
 .-=|| | |=-.
 `-=#$%&%$#=-'
 | ; :|
 _____.,-#%&$@%#&#~,._____
 _---~~(~~-_.
 _{ ) )
 , ) -~~- ( ,-' )_
 ( `-,_..`., )-- '_,)
 ( ` _) ( -~( -_ `, }
 (_- _ ~_-~~~~`, ,' ) <---- My brain right now...
 `~ -^( __;-,((()))
 ~~~~ {_ -_(())
 `\ }
 { }

I may not be able to sleep tonight…

Ascii art courtesy of http://chris.com/ascii/index.php?art=people/body%20parts/brains and http://www.ascii-code.com/ascii-art/weapons/explosives.php .

Copyright (C) 2016 by John Kitchin. See the License for information about copying.

org-mode source

Org-mode version = 8.2.10

Share on Twitter Discuss on Twitter