Common Lisp How-Tos

code lisp

John Jacobsen
Sunday, September 15, 2019

Home Other Posts

Earlier post Implementing Scheme in Python code python lisp

Later post From Elegance to Speed code lisp clojure physics

Intro

I’ve been writing this post as I go, and you may still see changes if you check back from time to time.

This post is for writing about things I’m figuring out, and for keeping notes on what I want to figure out next, as I get ramped up on Common Lisp. When I’m done there will hopefully be stuff here other people can use.

There’s a lot to love and admire about Common Lisp, but the language has some pointy bits that can at times make Clojure look friendly. With so many things to sort out I’m going to try to keep a few notes going forward just to keep it all organized. Caveat emptor, YMMV, USE AT YOUR OWN RISK, etc., etc.

Lessons Learned So Far

How Do I Set Up Common Lisp on a Mac?

I made a repo to automate how I set up a fresh SBCL install on a Mac, including Quicklisp. This gets me from zero to a working Emacs REPL system fairly quickly.

Note that I also set a LISP_HOME environment variable in my .bash_profile which I use in the examples which follow.

How Do I Get Environment Variables from Lisp?

From the Common Lisp Cookbook:

(uiop:getenv "HOME")

How Do I Quickly Create a New Project?

(There is a nice writeup on how Lisp projects are organized.)

First, it seems it’s best to pick a standard place to put your Lisp projects. I have a deep directory tree on my filesystem so would prefer to set that path as an environment variable; this makes the setup easy to port to another computer.

I made this bash script, lisplib:

#!/bin/bash

projname=${1?}
sbcl --non-interactive  \
     --disable-debugger \
     --eval '(ql:quickload "cl-project")' \
     --eval '(ql:quickload "cl-utilities")' \
     --eval '(let* ((projname "'$projname'") (home (sb-unix::posix-getenv "LISP_HOME")) (projpath (concatenate '"'"'string home "/" projname))) (cl-project:make-project (pathname projpath)))'

open -a /Applications/Emacs.app $LISP_HOME/$projname/src/main.lisp

When I, say, lisplib foo, it creates the project using make-project and opens the editor on the main source file.

How Do I Add Dependencies to One Of My Projects?

Add it to the .asd file in the :depends-on list.

How Do I Get My Local Projects Loadable By Other Projects?

I did this once:

$ cd ~/quicklisp
$ mv local-projects /tmp  # Mine was basically empty...
$ ln -s $LISP_HOME local-projects

How Do I Get Dependencies Loaded

  1. put your project in the directory symlinked above;
  2. jack into your REPL;
  3. update depends-on in the project’s .asd file as you add dependencies;
  4. (ql:quickload <current-package>) to pick up its dependencies.
  5. Optionally, to get the correct namespacing for the package you’re working on, use slime-repl-set-package (C-c M-p) to set the default package to the one you’re working on (not 100% sure what effect this has yet)

How Do I Build Binaries?

I use to Xach Beane’s buildapp, built like so:

git clone git@github.com:xach/buildapp.git
cd buildapp
make
make install

A small working build script using buildapp can be found here.

How Do I Get My Project Into Quicklisp?

Make a pull request with Xach Beane here.

How Do I Use Curses (or equivalent)?

After some research I decided to follow in Steve Losh’s footsteps and use cl-charms (tutorial here). This cost me multiple days due to some outdated Homebrew packages, but worked out in the end after updating those and reinstalling my Lisp setup.

How Do I Get Help?

Aside from Stack Overflow, the #lisp channel on IRC was helpful to me for the above issue.

Future Projects

  • Finish Weeds (redo of my blog software in CL)
  • Port namejen to CL
  • Write a Roguelike

Earlier post Implementing Scheme in Python code python lisp

Later post From Elegance to Speed code lisp clojure physics

Blog Posts (170)

Select from below, view all posts, or choose only posts for:art clojure code emacs lisp misc orgmode physics python ruby sketchup southpole writing


Home


From Elegance to Speed code lisp clojure physics

Implementing Scheme in Python code python lisp

A Daily Journal in Org Mode writing code emacs

Show at Northwestern University Prosthetics-Orthotics Center art

Color Notations art

Painting and Time art

Learning Muscular Anatomy code clojure art emacs orgmode

Reflections on a Year of Daily Memory Drawings art

Repainting art

Daily Memory Drawings art

Questions to Ask art

Macro-writing Macros code clojure

Time Limits art

Lazy Physics code clojure physics

Fun with Instaparse code clojure

Nucleotide Repetition Lengths code clojure

Updating the Genome Decoder code clojure

Getting Our Hands Dirty (with the Human Genome) code clojure

Validating the Genome Decoder code clojure

A Two Bit Decoder code clojure

Exploratory Genomics with Clojure code clojure

Rosalind Problems in Clojure code clojure

Introduction to Context Managers in Python code python

Processes vs. Threads for Integration Testing code python

Resources for Learning Clojure code clojure

Continuous Testing in Python, Clojure and Blub code clojure python

Programming Languages code clojure python

Milvans and Container Malls southpole

Oxygen southpole

Ghost southpole

Turkey, Stuffing, Eclipse southpole

Wind Storm and Moon Dust southpole

Shower Instructions southpole

Fresh Air and Bananas southpole

Traveller and the Human Chain southpole

Reveille southpole

Drifts southpole

Bon Voyage southpole

A Nicer Guy? southpole

The Quiet Earth southpole

Ten southpole

The Wheel art

Plein Air art

ISO50 southpole art

SketchUp and MakeHuman sketchup art

In Defense of Hobbies misc code art

Closure southpole

Takeoff southpole

Mummification southpole

Eleventh Hour southpole

Diamond southpole

Baby, It's Cold Outside southpole

Fruition southpole

Friendly Radiation southpole

A Place That Wants You Dead southpole

Marathon southpole

Deep Fried Macaroni and Cheese Balls southpole

Retrograde southpole

Three southpole

Transitions southpole

The Future southpole

Sunday southpole

Radio Waves southpole

Settling In southpole

Revolution Number Nine southpole

Red Eye to McMurdo southpole

That's the Way southpole

Faults in Ice and Rock southpole

Bardo southpole

Chasing the Sun southpole

Downhole southpole

Coming Out of Hibernation southpole

Managing the Most Remote Data Center in the World code southpole

Ruby Plugins for Sketchup art sketchup ruby code

The Cruel Stranger misc

Photoshop on a Dime art

Man on Wire misc

Videos southpole

Posing Rigs art

Metric art

Cuba southpole

Wickets southpole

Safe southpole

Broken Glasses southpole

End of the Second Act southpole

Pigs and Fish southpole

Last Arrivals southpole

Lily White southpole

In a Dry and Waterless Place southpole

Immortality southpole

Routine southpole

Tourists southpole

Passing Notes southpole

Translation southpole

RNZAF southpole

The Usual Delays southpole

CHC southpole

Wyeth on Another Planet art

Detox southpole

Packing southpole

Nails southpole

Gearing Up southpole

Gouache, and a new system for conquering the world art

Fall 2008 HPAC Studies art

YABP (Yet Another Blog Platform) southpole

A Bath southpole

Green Marathon southpole

Sprung southpole

Outta Here southpole

Lame Duck DAQer southpole

Eclipse Town southpole

One More Week southpole

IceCube Laboratory Video Tour; Midrats Finale southpole

SPIFF, Party, Shift Change southpole

Good things come in threes, or 18s southpole

Sleepless in the Station southpole

Post Deploy southpole

Midrats southpole

IceCube and The Beatles southpole

Video: Flight to South Pole southpole

The Pure Land southpole

Almost There southpole

There are no mice in the Hotel California Bunkroom southpole

Short Timer southpole

Sleepy in MacTown southpole

Superposition of Luggage States southpole

Sir Ed southpole

Shortcut to Toast southpole

Pynchon, Redux southpole

Flights: Round 1 southpole

Packing for the Pole southpole

Goals for Trip southpole

Balaklavas southpole

Tree and Man (Test Post) southpole

Schedule southpole

How to mail stuff to John at the South Pole southpole

Summer and Winter southpole

Homeward Bound southpole

Redeployment southpole

Short-timer southpole

The Cleanest Air in the World southpole

One more day (?) southpole

One more week (?) southpole

Closing Softly southpole

More Photos southpole

Super Bowl Wednesday southpole

Night Owls southpole

First Week southpole

More Ice Pix southpole

Settling In southpole

NPX southpole

Pole Bound southpole

Bad Dirt southpole

The Last Laugh southpole

Nope southpole

First Delay southpole

Batteries and Sheep southpole

All for McNaught southpole

The Big (Really really big...) Picture southpole

t=0 southpole

Giacometti southpole

Descent southpole

Video Tour southpole

How to subscribe to blog updates southpole

What The Blog is For southpole

Auckland southpole

Halfway Around the World; Dragging the Soul Behind southpole

Launched southpole

Getting Ready (t minus 2 days) southpole

Home

Subscribe: RSS feed ... all topics) ... or Clojure only / Lisp only