Skip to content
An actor system for Common Lisp.
Common Lisp
Branch: master
Clone or download

Latest commit

Fetching latest commit…
Cannot retrieve the latest commit at this time.


Type Name Latest commit message Commit time
Failed to load latest commit information.
examples Fixed the errors in the .asd system definition and the style warnings… May 9, 2011
LICENSE Changing the license to BSD. Apr 5, 2012 Update Feb 16, 2019
actors.lisp Delete slots add, main + Add slots lock, cv, behavior May 10, 2012
cl-actors.asd Update cl-actors.asd Oct 26, 2019
package.lisp Update package.lisp Oct 24, 2019

This is a simple and easy to use Actor system in Common Lisp.


Requires Bordeaux threads. 2. Just load actors.lisp and start using it. If you have Quicklisp, (ql:quickload "cl-actors")


A small manual can be found at :

  • Creating an actor class or template

      (defactor Actor-Class
  • Creating an actor instance

         (setq my-actor (Actor-Class (:state-var_1 value_1 ...
    	 	  	        :state-var_n value_n)))
  • Sending a message

       (send my-actor message_args)


  1. Concurrency using the actors model.
  2. Dynamic behavior change of actors.


  • A ticker: Keeps printing out a count every 2 seconds, starting from 0 and incrementing it every 2 seconds.
;create the ticker template
(defactor ticker ((counter 0)) (m) 
	     (sleep 2) (pr counter)
	        (incf counter) (send self nil) next)
; Create an instance
(setf t1 (ticker))
; send a message (async)
(send t1 nil)
; to stop use
(stop-actor t1)
  • A print actor: Prints the message which was sent to it. A very useful utility actor.
	;create the actor template
(defactor print-actor () (val) (pr val) next)
; initialize a new instance
(setf printer (print-actor))
;send values for printing
(send printer "hello, world")
  • A factorial computing actor : The name says it all :)
;create the template
(defactor fact ((temp 1)) (n cust) 
	     (if (equal 1 n) 
	            (progn (send cust (* temp 1))
                      (setf temp 1) next)
		             (progn (setf temp (* n temp))
                      (send self (- n 1) cust) next)))
;create a new instance 
(setf f (fact))
; send a value
(send f 4 print-actor)
  • A nagger for fun : Works only in Mac OS X. Keeps saying out aloud "please work" every 10 seconds :)
(defactor nagger () () 
    (sleep 10)
       (trivial-shell:shell-command "say please work")
          (send self) next)
; anonymous actor , no way to stop the nagging 
(send (nagger))

More Resources

  1. Meta-Circular Adventures in Functional Abstraction The wonderful and detailed original blog post is no longer availabe. The link below points to a snaphost.
You can’t perform that action at this time.