Bluish Coder

Programming Languages, Martials Arts and Computers. The Weblog of Chris Double.


2014-06-09

PicoLisp on Android

PicoLisp is a small Lisp interpreter that tries to stay true to the path of 'code is data' as much as possible. It has some nice features, including a persistent database and built in prolog engine. The system is quite reflective and this is shown in the way you can use vim to browse the live system.

There is a 32-bit and 64-bit version. The 64-bit version has some nice additional features but for running on Android the 32 bit version is needed. Building for Android is fairly easy. The approach is similar to the way I built Wasp Lisp on Android.

The first step is to install a 'standalone toolchain' version of the Android NDK. The steps to do this is described in my Wasp Lisp post so I won't repeat them here. The main complication for my setup was getting this to work on NixOS. I created a Nix package definition to install the NDK and generate the standalone toolchain.

The 32-bit version of picoLisp is built from the src subdirectory in the source download. Some minor changes are needed to use the Android cross compiler from the standalone toolchain. I've put these in android.patch. To apply the patch and build:

$ tar xvf picoLisp-3.1.6.tgz
$ cd picoLisp
$ curl http://bluishcoder.co.nz/picolisp/android.patch | patch -p1
$ cd src
$ make TARGET=Android

To make testing easier I push the entire PicoLisp install to my Android device. For JellyBean and above it might be hard to find a place to install it with the correct permissions. On my KitKat device I can use /data/local/tmp even though that directory isn't visible by listing it. You can push to it and cd to it from the shell:

$ cd picoLisp
$ adb push picoLisp /data/local/tmp/picoLisp

PicoLisp creates some files in the .pil directory off the HOME directory. This should be explicitly set when running it in the Android shell since the HOME directory is not writeable:

$ adb shell
$ cd /data/local/tmp/picoLisp
$ HOME=/data/local/tmp ./pil +
: (+ 1 2)
-> 3

Unfortunately the 32-bit version of PicoLisp doesn't have the Native C Calls that the 64-bit version has. It does allow inline C code but this requires a gcc compiler to be available. It may be possible to use a natively compiled gcc.

In the meantime it's possible to write shared libraries in C which can be loaded on Android. An example of doing this is ext.c in the distribution. This is already compiled and copied to Android in the steps above. Any Lisp symbol prefixed by a name plus ':' is checked if it exists in a shared library with the given name. So the symbol ext:Snx is the Snx function in the ext shared library. An example of calling this in Android:

: (ext:Snx "hello")
-> "HL"

Running the PicoLisp webserver on Android looks like:

$ cd /data/local/tmp/picoLisp
$ HOME=/data/local/tmp ./pil @lib/http.l  --server 8080 @doc/hello.l  -wait

This can be accessed from the web browser on the device at http://127.0.0.1:8080.

Unfortunately in recent versions of Android (at least KitKat) it's not possible to run PicoLisp from /data/local/tmp from within the terminal emulator apps available on the App store as far as I can see. I get permission denied errors. Earlier versions of Android work in my testing. If your phone is rooted this won't be a problem, it should work. I've also tested PicoLisp on a rooted Firefox OS phone and it works fine. Writing server side programs in PicoLisp that can be accessed as Web Applications on Firefox OS could be an interesting project for testing and prototyping ideas.

Other users have gotten PicoLisp running on Android as well:

Tags


This site is accessable over tor as hidden service mh7mkfvezts5j6yu.onion, or Freenet using key:
USK@1ORdIvjL2H1bZblJcP8hu2LjjKtVB-rVzp8mLty~5N4,8hL85otZBbq0geDsSKkBK4sKESL2SrNVecFZz9NxGVQ,AQACAAE/bluishcoder/-44/


Tags

Archives
Links