View search-worksheet.clj
;; gorilla-repl.fileformat = 1
;; **
;;; # Search
;;; Lecture notes on AI search algorithms, with Clojure code.
;;; Lee Spector,, 20141015-20170930
;;; Some of the code here was adapted from the [search.lisp]( Common Lisp code in Peter Norvig's Paradigms of AI Programming (1991), but with substantial modifications.
View search.clj
(ns search.core)
;; Lecture notes on AI search algorithms.
;; Lee Spector,, 20141015
#_(defn is-5 [n]
(= n 5))
#_(filter is-5 [1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1])
View vp2d.clj
;; Initial sketches toward a 2d swarm-like alife system in Clojure/Quil
;; Lee Spector,, 20140409
(ns vp2d.core
(:use quil.core)
(def all-pods (atom []))
(def iteration (atom 0))
View notes.clj
;; Minimal example of how to play a melody using Clojure/Overtone/Leipzig, based on code
;; at
;; by Lee Spector,, 20140204
;; Add the following to your dependencies in, and do "lein deps" if your environment requires it:
;; [leipzig "0.7.0"]
(ns notes.core
(:use [leipzig melody scale live]

General Info

  • The master branch is the stable main branch. No one should ever need to edit the master branch, and even if they do, they should definitely never push it to the Github repository. All changes to master will come as merges from other branches, which Lee will be responsible for merging with master.

  • Branches are easy and cheap to create, and should be used extensively. If you ever want to "try something out", make sure you branch from master (or some other branch) first. If you want to add a feature to a project permanently, create a branch for it while you test it, and once the bugs are ironed out, then it can be merged to master (by Lee or whoever is managing the project). If you find a bug in master, create a branch to fix it. If you want to add some code for an experiment for a paper, create a branch for it. I cannot emphasize enough: things will be easier for all of us if we always create branches for any changes to master that we need.

  • Whenever Lee updates

View evolvefn_noeval.clj
;; Lee Spector ( 20111018 - 20120819
;; 20111113 update: handles functions of different arities
;; 20120819 update: forked this from evolvefn.clj and removed eval
(ns evolvefn_noeval
(:require [ :as zip])
(:use [clojure.walk]))
;; This code defines and runs a genetic programming system on the problem
View lexicase.clj
;; c) Lee Spector (, 2012
;; Clojure code for genetic programming with lexicase selection for modal problems.
;; See
;; Written to run with Clojure 1.3.
(ns lexicase.core
(:require [ :as zip]))
View eval_with_tagging_with_args.clj
(ns eval_with_tagging_with_args)
;; A call-limited evaluator for Lisp-style symbolic expressions with zero-argument
;; and one-argument tag-based modules (see
;; Lee Spector,, 20120121
(def tagdo-semantics true)
(defn closest-association
"Returns the value for the closest match to the given tag in the given tag space, with
View tag_regression.clj
;; Lee Spector ( 20120106-20120117
;; Clojure code for tree-based genetic programming with tags (see
;; REQUIRES Clojure 1.3 for the concurrency to work (set single-thread-mode to true otherwise)
(ns tag-regression
(:require [ :as zip]))
(def single-thread-mode false)
View evolvegeo.clj
;; Lee Spector ( 20111018 - 20111121
(ns evolvegeo
(:require [ :as zip]))
;; Like evolvefn.clj (, this this code
;; defines and runs a genetic programming system on the problem
;; of finding a function that fits a particular set of [x y] pairs.
;; Unlike evolvefn.clj, this code incorporates trivial geography
;; (