1.20 Interactive embedded development with uLisp, Arduino and Emacs =================================================================== 2017-08-04 AS I MENTIONED IN MY *note 'POST ABOUT ADA': Arduino Programming with Ada, LISP HAS A COMPLETELY DIFFERENT APPROACH in terms of... well, just about everything, beginning with the type system. One important feature of Lisp environments is the high degree if interaction they provide: Lisp Systems allowed for interaction with every part of the system (OS, applications, window manager...) and to a smaller degree this is what the read-eval-print-loop approach (REPL) provides in, say, Emacs with SLIME. One interesting language I found recently was uLisp, a Lisp language for the Arduino and MSP430 platforms. It is based on a subset of Common Lisp and provides a different approach to development: it installs an interpreter which is programmed via the serial interface, thus allowing for a much more interactive development style (at a certain cost in terms of available space). The interaction is normally made with the Arduino IDE, via the Serial Monitor; uLisp contains a minimal editor as well, but using Emacs makes more sense and it's actually easy to configure to that end; before going into the details this is the end result (zoom in the image if necessary to start the animation). ++++++++++++=+++++++++++=+++++++++++++++++++++++++++++++++++++++++++++ ::::::::.:::::.::::::.............:::::::::::::::::..................: ............:.....................::.................................. ::................................:::::::::::........................: ::::::::........:......:..........:-::::::::..:...::.................: .:-::.............................:::::-:-::::.::....................: .:::-::::::::::...................::.::::::.::.:.:.::................: :.:::.....:.......................::.................................: :.................................::.................................: ..................................::.................................: :.................................::.................................: :.................................::.................................: :.................................::.................................: :.................................::.................................: :.................................::.................................: :.................................::.................................: ..................................::.................................. :...::::.::::::::::::::::::.......::.....:........:::::::::::........: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: The main thing to consider is that inferior-lisp-mode is actually based on comint-mode, which simplifies things: we just need a way to replace the buffer created by calling inferior-lisp with a buffer that communicates via the serial port. This is, in turn, something which can be done using Emacs term-mode. Combining all of this the following Emacs Lisp code will connect to the Arduino via the serial port, rename the resulting buffer and change to line mode. ;; Arduino LED blink ;; ;; Based on the example at http://www.ulisp.com/show?1LG8 ;; ;; 2017, Frederico Munoz (defun b (x s d) "Slowly increases and decreases the blinking interval in a loop" (pinmode 13 t) (digitalwrite 13 x) (delay s) (cond ((< s 100) (b (not x) (+ s 50) 50)) ((> s 1000) (b (not x) (- s 50) -50)) (t (b (not x) (+ s d) d)))) (b t 500 50) Gist (https://gist.github.com/fsmunoz/ef4a04c5f4eb117087a923d2555563af#file-arduino-serial-el) Creating a new Lisp file (like test.lisp) will by default enter lisp-mode; in this mode we can use C-x C-e to send the s-expression to the uLisp interpreter and get the result, as seen in the previous screencast ;; Arduino LED blink ;; ;; Based on the example at http://www.ulisp.com/show?1LG8 ;; ;; 2017, Frederico Munoz (defun b (x s d) "Slowly increases and decreases the blinking interval in a loop" (pinmode 13 t) (digitalwrite 13 x) (delay s) (cond ((< s 100) (b (not x) (+ s 50) 50)) ((> s 1000) (b (not x) (- s 50) -50)) (t (b (not x) (+ s d) d)))) (b t 500 50) I've put the Lisp code on Github as well (1)) ---------- Footnotes ---------- (1) I've put the Lisp code on Github as well (https://gist.github.com/fsmunoz/424b052e1848cdda3bee043386bdc7bd#file-blink-lisp)